# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) | # Build Folders (you can keep bin if you'd like, to store dlls and pdbs) |
[Bb]in/ | [Bb]in/ |
[Oo]bj/ | [Oo]bj/ |
# Unity specific | |
[Ll]ibrary/ | |
[Tt]emp/ | |
*.unityproj | |
# mstest test results | # mstest test results |
TestResults | TestResults |
## Ignore Visual Studio temporary files, build results, and | ## Ignore Visual Studio temporary files, build results, and |
## files generated by popular Visual Studio add-ons. | ## files generated by popular Visual Studio add-ons. |
# User-specific files | # User-specific files |
*.suo | *.suo |
*.user | *.user |
*.sln.docstates | *.sln.docstates |
# Build results | # Build results |
[Dd]ebug/ | [Dd]ebug/ |
x64/ | x64/ |
*_i.c | *_i.c |
*_p.c | *_p.c |
*.ilk | *.ilk |
*.meta | *.meta |
*.obj | *.obj |
*.pch | *.pch |
*.pdb | *.pdb |
*.pgc | *.pgc |
*.pgd | *.pgd |
*.rsp | *.rsp |
*.sbr | *.sbr |
*.tlb | *.tlb |
*.tli | *.tli |
*.tlh | *.tlh |
*.tmp | *.tmp |
*.log | *.log |
*.vspscc | *.vspscc |
*.vssscc | *.vssscc |
.builds | .builds |
# Visual C++ cache files | # Visual C++ cache files |
ipch/ | ipch/ |
*.aps | *.aps |
*.ncb | *.ncb |
*.opensdf | *.opensdf |
*.sdf | *.sdf |
# Visual Studio profiler | # Visual Studio profiler |
*.psess | *.psess |
*.vsp | *.vsp |
*.vspx | *.vspx |
# Guidance Automation Toolkit | # Guidance Automation Toolkit |
*.gpState | *.gpState |
# ReSharper is a .NET coding add-in | # ReSharper is a .NET coding add-in |
_ReSharper* | _ReSharper* |
# Mindbench SASS cache | # Mindbench SASS cache |
.sass-cache/ | .sass-cache/ |
# NCrunch | # NCrunch |
*.ncrunch* | *.ncrunch* |
.*crunch*.local.xml | .*crunch*.local.xml |
# Installshield output folder | # Installshield output folder |
[Ee]xpress | [Ee]xpress |
# DocProject is a documentation generator add-in | # DocProject is a documentation generator add-in |
DocProject/buildhelp/ | DocProject/buildhelp/ |
DocProject/Help/*.HxT | DocProject/Help/*.HxT |
DocProject/Help/*.HxC | DocProject/Help/*.HxC |
DocProject/Help/*.hhc | DocProject/Help/*.hhc |
DocProject/Help/*.hhk | DocProject/Help/*.hhk |
DocProject/Help/*.hhp | DocProject/Help/*.hhp |
DocProject/Help/Html2 | DocProject/Help/Html2 |
DocProject/Help/html | DocProject/Help/html |
# Click-Once directory | # Click-Once directory |
publish | publish |
# Publish Web Output | # Publish Web Output |
*.Publish.xml | *.Publish.xml |
# NuGet Packages Directory | # NuGet Packages Directory |
packages | packages |
# Windows Azure Build Output | # Windows Azure Build Output |
csx | csx |
*.build.csdef | *.build.csdef |
# Windows Store app package directory | # Windows Store app package directory |
AppPackages/ | AppPackages/ |
# Others | # Others |
sql | sql |
TestResults | TestResults |
[Tt]est[Rr]esult* | [Tt]est[Rr]esult* |
*.Cache | *.Cache |
ClientBin | ClientBin |
[Ss]tyle[Cc]op.* | [Ss]tyle[Cc]op.* |
~$* | ~$* |
*.dbmdl | *.dbmdl |
Generated_Code #added for RIA/Silverlight projects | Generated_Code #added for RIA/Silverlight projects |
# Backup & report files from converting an old project file to a newer | # Backup & report files from converting an old project file to a newer |
# Visual Studio version. Backup files are not needed, because we have git ;-) | # Visual Studio version. Backup files are not needed, because we have git ;-) |
_UpgradeReport_Files/ | _UpgradeReport_Files/ |
Backup*/ | Backup*/ |
UpgradeLog*.XML | UpgradeLog*.XML |
# SQL Server files | # SQL Server files |
App_Data/*.mdf | App_Data/*.mdf |
App_Data/*.ldf | App_Data/*.ldf |
[Gg]ame/ | [Gg]ame/ |
[Rr]elease/ | [Rr]elease/ |
Binary files a/Assets/CurseLogo.png and /dev/null differ
Binary files a/Assets/CurseLogo.psd and /dev/null differ
Binary files a/Assets/DropDownBackground.psd and /dev/null differ
Binary files /dev/null and b/Assets/Images/app-launcher-icon.psd differ
Binary files /dev/null and b/Assets/Images/flight-menu-background.psd differ
Binary files /dev/null and b/Assets/Images/ui-drop-down.psd differ
using UnityEditor; | |
using UnityEngine; | |
public class BuildAssetBundles : MonoBehaviour | |
{ | |
[MenuItem("Assets/Build Asset Bundles")] | |
public static void Build() | |
{ | |
BuildPipeline.BuildAssetBundles(Application.dataPath + "/../Output/KerbalEngineer", BuildAssetBundleOptions.UncompressedAssetBundle); | |
} | |
} |
Binary files a/Assets/ToolbarBackground.psd and /dev/null differ
Binary files a/Assets/ToolbarIcon.psd and /dev/null differ
1.0.18.1 | Changed: Thermal flux is now correctly indicated in kilowatts. |
1.0.19.4, 12-02-16 | |
Fixed: Only 'STAGE_STACK_FLOW' and 'STAGE_STACK_FLOW_BALANCE' resources include surface mounted parts as fuel targets. | |
Fixed: Fairing mass being doubled in the VAB (removed workaround for a KSP bug which has been fixed). | |
1.0.19.3, 09-02-16 | |
Fixed: Fuel cross-feed from surface attached parts. | |
1.0.19.2, 19-11-15 | |
Rebuild for KSP 1.0.5.1028 silent update. | |
1.0.19.1, 09-11-15 | |
Added: Key binding editor accessible under 'Settings' on the Build Engineer. | |
Added: Added current vessel name readout. (antplant) | |
Added: 'Relative Radial Velocity' and 'Time To Rendezvous' readouts. (itwtx) | |
Added: Readout help strings. (harryyoung) | |
Changed: The 'Torque' value in the editor is now precise to two decimal places. | Changed: The 'Torque' value in the editor is now precise to two decimal places. |
Changed: Time formatting reference (Kerbin/Earth) is now based on the in-game setting. | |
Changed: Eccentric Anomaly, Mean Anomaly and Mean Anomaly At Epoc now display in degrees rather than radians. | |
Fixed: Optimised time formatting. (itwtx) | |
Fixed: TimeToAtmosphere checks that the Apoapsis is outside atmosphere. (Kerbas-ad-astra) | |
Fixed: Issue with stage priority flow. Caused Rapier calculations to fail if LF and O are drawn from different tanks. (Padishar) | |
Fixed: Issue with angle to prograde/retrograde calculations on highly inclined orbits. | |
Fixed: Editor input locks not being reset when a scene change is forced (e.g. via Kerbal Construction Time). | |
Fixed: Roll axis readout now shows the correct sign. | |
Removed: Time Formatter readout as it's not required anymore. | |
1.0.18.0 | 1.0.18.0 |
Added: Orbital readouts - "Speed at Periapsis" and "Speed at Apoapsis". (Padishar) | Added: Orbital readouts - "Speed at Periapsis" and "Speed at Apoapsis". (Padishar) |
Added: Manoeuvre readouts - "Post-burn Apoapsis" and "Post-burn Periapsis". (Padishar) | Added: Manoeuvre readouts - "Post-burn Apoapsis" and "Post-burn Periapsis". (Padishar) |
Added: Orbital readout - "Time to Atmosphere". | Added: Orbital readout - "Time to Atmosphere". |
Fixed: Synched the minimum simulation time sliders and stopped them from snapping back after 999ms. (saybur) | Fixed: Synched the minimum simulation time sliders and stopped them from snapping back after 999ms. (saybur) |
Fixed: Added workaround for the bug in Vessel.horizontalSrfSpeed (Padishar) | Fixed: Added workaround for the bug in Vessel.horizontalSrfSpeed (Padishar) |
Fixed: Physically insignificant part mass was not being correctly cascaded down through multiple parent parts. | Fixed: Physically insignificant part mass was not being correctly cascaded down through multiple parent parts. |
Fixed: Intake air demand calculation not working. | Fixed: Intake air demand calculation not working. |
Fixed: Some build engineer settings labels do not scale with UI size. | Fixed: Some build engineer settings labels do not scale with UI size. |
1.0.17.0 | 1.0.17.0 |
Added: 'Mach Number' readout under the 'Surface' category and included it on the default surface HUD. | Added: 'Mach Number' readout under the 'Surface' category and included it on the default surface HUD. |
Added: Stock sections in the Flight Engineer can now become HUDs. | Added: Stock sections in the Flight Engineer can now become HUDs. |
Added 'Thermal' readouts category including: | Added 'Thermal' readouts category including: |
Internal Flux | Internal Flux |
Convection Flux | Convection Flux |
Radiation Flux | Radiation Flux |
Critical Part Name | Critical Part Name |
Critical Part Temperature | Critical Part Temperature |
Critical Part Skin Temperature | Critical Part Skin Temperature |
Critical Part Thermal Percentage of Max Temperature | Critical Part Thermal Percentage of Max Temperature |
Hottest Part Name | Hottest Part Name |
Hottest Part Temperature | Hottest Part Temperature |
Hottest Part Skin Temperature | Hottest Part Skin Temperature |
Coldest Part Name | Coldest Part Name |
Coldest Part Temperature | Coldest Part Temperature |
Coldest Part Skin Temperature | Coldest Part Skin Temperature |
Changed: Mach on the Build Engineer now accurate to 2 decimal places. | Changed: Mach on the Build Engineer now accurate to 2 decimal places. |
Changed: Max mach in the Build Engineer defaults to 1.00 even when no jet engines are present. | Changed: Max mach in the Build Engineer defaults to 1.00 even when no jet engines are present. |
Changed: Increased eccentricity readout to 5 decimal places. | Changed: Increased eccentricity readout to 5 decimal places. |
Changed: Implemented Sarbian's object pooling. | Changed: Implemented Sarbian's object pooling. |
Changed: The default selected body is now assigned via 'Planitarium.Home'. | Changed: The default selected body is now assigned via 'Planitarium.Home'. |
Changed: HUDs to clamp fully inside the screen instead of allowing them to run off the edge by a certain amount. | Changed: HUDs to clamp fully inside the screen instead of allowing them to run off the edge by a certain amount. |
Fixed: Physically insignificant part mass is now associated with the parent part. | Fixed: Physically insignificant part mass is now associated with the parent part. |
Fixed: Longitude and Latitude readouts now use a KER formatter instead of Squad's incorrect implementation. | Fixed: Longitude and Latitude readouts now use a KER formatter instead of Squad's incorrect implementation. |
Fixed: Possible null reference in the Rendezvous Processor. | Fixed: Possible null reference in the Rendezvous Processor. |
Fixed: Fairing mass issues introduced with regards to simulation changes. | Fixed: Fairing mass issues introduced with regards to simulation changes. |
Fixed: Use of per-propellant fuel flow mode override. | Fixed: Use of per-propellant fuel flow mode override. |
Fixed: Burn times calculated for jet engines. | Fixed: Burn times calculated for jet engines. |
Fixed: Thrust issues introduced with Sarbian's simulation alterations. | Fixed: Thrust issues introduced with Sarbian's simulation alterations. |
Fixed: Issue where HUDs positioned close to the top/bottom of the screen could be pushed out of position. | Fixed: Issue where HUDs positioned close to the top/bottom of the screen could be pushed out of position. |
1.0.16.6, 02-05-15 | 1.0.16.6, 02-05-15 |
Fixed: Separately staged fairing mass jettisons are now calculated in the editor. | Fixed: Separately staged fairing mass jettisons are now calculated in the editor. |
1.0.16.5, 02-05-2015 | 1.0.16.5, 02-05-2015 |
Fixed: Delta-V not being correctly calculated. | Fixed: Delta-V not being correctly calculated. |
Changed: Editor locking now uses the InputLockManager. | Changed: Editor locking now uses the InputLockManager. |
1.0.16.4, 01-05-2015 | 1.0.16.4, 01-05-2015 |
Fixed: Physically insignificant part mass is now accounted for. | Fixed: Physically insignificant part mass is now accounted for. |
Changed: Module mass accounted for as it now makes its way onto the launch pad (e.g. fairings). | Changed: Module mass accounted for as it now makes its way onto the launch pad (e.g. fairings). |
Various optimisations: | Various optimisations: |
Object pooling. | Object pooling. |
Removed LINQ expressions. | Removed LINQ expressions. |
Converted foreach to for loops. | Converted foreach to for loops. |
1.0.16.3, 27-04-2015 | 1.0.16.3, 27-04-2015 |
Fixed issue with the toolbar icons not being created. | Fixed issue with the toolbar icons not being created. |
Removed superfluous 'm/s' on the mach slider in the build engineer. | Removed superfluous 'm/s' on the mach slider in the build engineer. |
1.0.16.2, 27-04-2015 | 1.0.16.2, 27-04-2015 |
Changed the atmospheric slider on the build engineer to default to 0km when changing bodies. | Changed the atmospheric slider on the build engineer to default to 0km when changing bodies. |
1.0.16.1, 26-04-2015, KSP Build #828 | 1.0.16.1, 26-04-2015, KSP Build #828 |
Merged Sarbian's mach adjustments. | Merged Sarbian's mach adjustments. |
Fixed bugs relating to thrust and atmosphere/velocity curves. | Fixed bugs relating to thrust and atmosphere/velocity curves. |
Changed the atmospheric slider on the Build Engineer to work based on altitude. | Changed the atmospheric slider on the Build Engineer to work based on altitude. |
Changed the atmospheric slider to clamp to the maximum altitude for the selected body. | Changed the atmospheric slider to clamp to the maximum altitude for the selected body. |
Changed the velocity slider to clamp to the maximum usable mach value for the current vessel. | Changed the velocity slider to clamp to the maximum usable mach value for the current vessel. |
1.0.16.0, 25-04-2015, KSP Build #821 | 1.0.16.0, 25-04-2015, KSP Build #821 |
Fixed errors relating to KSP 1.0 update. | Fixed errors relating to KSP 1.0 update. |
Fixed fuel simulation to account for new thrust system. | Fixed fuel simulation to account for new thrust system. |
Fixed atmospheric engines to use the new velocity curve. | Fixed atmospheric engines to use the new velocity curve. |
Fixed atmospheric readouts to work with the new atmospheric model. | Fixed atmospheric readouts to work with the new atmospheric model. |
1.0.15.2, 13-02-2015 | 1.0.15.2, 13-02-2015 |
Padishar's Fixes: | Padishar's Fixes: |
Fixed: Calculation of per-stage resource mass. | Fixed: Calculation of per-stage resource mass. |
1.0.15.1, 13-02-2015 | 1.0.15.1, 13-02-2015 |
Rebuild | Rebuild |
1.0.15.0, 08-02-2015 | 1.0.15.0, 08-02-2015 |
Padishar's Fixes: | Padishar's Fixes: |
Added: Support KIDS ISP thrust correction. | Added: Support KIDS ISP thrust correction. |
Fixed: Log spam for stage priority mode. | Fixed: Log spam for stage priority mode. |
Fixed: Locked tanks preventing simulation from staging. | Fixed: Locked tanks preventing simulation from staging. |
Fixed: No flow and all vessel modes to respect flow states. | Fixed: No flow and all vessel modes to respect flow states. |
1.0.14.1, 28-12-2014 | 1.0.14.1, 28-12-2014 |
Fixed: Missing texture on the ER-7500 model. | Fixed: Missing texture on the ER-7500 model. |
1.0.14.0, 28-12-2014 | 1.0.14.0, 28-12-2014 |
Added: Career mode that limits the Flight Engineer by: | Added: Career mode that limits the Flight Engineer by: |
- Requiring an Engineer Kerbal of any level, or placement of an Engineer Chip or ER-7500 part. | - Requiring an Engineer Kerbal of any level, or placement of an Engineer Chip or ER-7500 part. |
- Tracking station level 3 enables Flight Engineer everywhere. | - Tracking station level 3 enables Flight Engineer everywhere. |
Added: New readouts to the orbital category: | Added: New readouts to the orbital category: |
- Mean Anomaly at Epoc | - Mean Anomaly at Epoc |
Added: New readouts to the miscellaneous category: | Added: New readouts to the miscellaneous category: |
- System Time | - System Time |
Added: Editor Overlay Tab's X position is now changable in the BuildOverlay.xml settings file. | Added: Editor Overlay Tab's X position is now changable in the BuildOverlay.xml settings file. |
Changed: Editor Overlay Tabs start position moved over as to not overlap the parts menu. | Changed: Editor Overlay Tabs start position moved over as to not overlap the parts menu. |
Fixed: Bug where STAGE_PRIORITY_FLOW resources would not be corrently disabled/enabled. | Fixed: Bug where STAGE_PRIORITY_FLOW resources would not be corrently disabled/enabled. |
Fixed: Issue with the formatting large Mass and Cost values. | Fixed: Issue with the formatting large Mass and Cost values. |
Fixed: Error when loading the Engineer7500 part model. | Fixed: Error when loading the Engineer7500 part model. |
1.0.13.1, 16-12-2014 | 1.0.13.1, 16-12-2014 |
Fixed: Issue with manoeuvre node readouts and low tier tracking station. | Fixed: Issue with manoeuvre node readouts and low tier tracking station. |
1.0.13.0, 16-12-2014 | 1.0.13.0, 16-12-2014 |
Updated for KSP version 0.90 | Updated for KSP version 0.90 |
Added: New readouts to the vessel category: | Added: New readouts to the vessel category: |
- Heading Rate | - Heading Rate |
- Pitch Rate | - Pitch Rate |
- Roll Rate | - Roll Rate |
Changed: Simulation to look for fuel lines that use CModuleFuelLine module. | Changed: Simulation to look for fuel lines that use CModuleFuelLine module. |
Fixed: Editor Overlay now loads the saved visibility value properly. | Fixed: Editor Overlay now loads the saved visibility value properly. |
Fixed: Altitude (Terrain) will no longer give a reading below sea level. | Fixed: Altitude (Terrain) will no longer give a reading below sea level. |
Fixed: Suicide burn now uses radar altitude that clamps to sea level. | Fixed: Suicide burn now uses radar altitude that clamps to sea level. |
1.0.12.0, 01-12-2014 | 1.0.12.0, 01-12-2014 |
Added: Setting in Build Engineer to enable/disable vectored thrust calculations. | Added: Setting in Build Engineer to enable/disable vectored thrust calculations. |
Added: Thrust torque field in Build Engineer (courtesy of mic_e). | Added: Thrust torque field in Build Engineer (courtesy of mic_e). |
Added: New readouts to the vessel category: | Added: New readouts to the vessel category: |
- Thrust Offset Angle (courtesy of mic_e) | - Thrust Offset Angle (courtesy of mic_e) |
- Thrust Torque (courtesy of mic_e) | - Thrust Torque (courtesy of mic_e) |
- Part Count: stage/total | - Part Count: stage/total |
- Heading | - Heading |
- Pitch | - Pitch |
- Roll | - Roll |
Added: New readouts to the surface category: | Added: New readouts to the surface category: |
- Situation | - Situation |
Added: New readouts to the miscellaneous category: | Added: New readouts to the miscellaneous category: |
- Vectored Thrust Toggle | - Vectored Thrust Toggle |
Fixed: The category selection within the section editors now do not always reset back to 'Orbital'. | Fixed: The category selection within the section editors now do not always reset back to 'Orbital'. |
Fixed: Issue where the vessel simulation can sometimes permanently freeze. | Fixed: Issue where the vessel simulation can sometimes permanently freeze. |
Fixed: Issue where the vessel simulation would not show updates when the delay was set lower than the frame rate. | Fixed: Issue where the vessel simulation would not show updates when the delay was set lower than the frame rate. |
1.0.11.3, 11-11-2014 | 1.0.11.3, 11-11-2014 |
Changed: Gravity measurements for Isp to 9.82. | Changed: Gravity measurements for Isp to 9.82. |
1.0.11.2, 10-11-2014 | 1.0.11.2, 10-11-2014 |
Changed: Gravity measurements for Isp calculations from 9.81 to 9.8066 for accuracy. | Changed: Gravity measurements for Isp calculations from 9.81 to 9.8066 for accuracy. |
Changed: Manoeuvre node burn times are now more accurate. | Changed: Manoeuvre node burn times are now more accurate. |
Fixed: Bug in the manoeuvre node burn time calculations where it was not averaging acceleration correctly. | Fixed: Bug in the manoeuvre node burn time calculations where it was not averaging acceleration correctly. |
1.0.11.1, 07-11-2014 | 1.0.11.1, 07-11-2014 |
Changed: Build Engineer now shows stage part count as well as total. | Changed: Build Engineer now shows stage part count as well as total. |
Changed: Build Overlay Vessel tab data: | Changed: Build Overlay Vessel tab data: |
DeltaV: stage / total | DeltaV: stage / total |
Mass: stage / total | Mass: stage / total |
TWR: start (max) <- shows for bottom stage only. | TWR: start (max) <- shows for bottom stage only. |
Parts: stage / total | Parts: stage / total |
Fixed: Issue with the vessel tab vanishing from the editor. | Fixed: Issue with the vessel tab vanishing from the editor. |
1.0.11.0, 06-11-2014 | 1.0.11.0, 06-11-2014 |
Added: New readouts to the orbital category: | Added: New readouts to the orbital category: |
- Current SOI | - Current SOI |
- Manoeuvre Node DeltaV (Prograde) | - Manoeuvre Node DeltaV (Prograde) |
- Manoeuvre Node DeltaV (Normal) | - Manoeuvre Node DeltaV (Normal) |
- Manoeuvre Node DeltaV (Radial) | - Manoeuvre Node DeltaV (Radial) |
- Manoeuvre Node DeltaV (Total) | - Manoeuvre Node DeltaV (Total) |
- Manoeuvre Node Burn Time | - Manoeuvre Node Burn Time |
- Manoeuvre Node Half Burn Time | - Manoeuvre Node Half Burn Time |
- Manoeuvre Node Angle to Prograde | - Manoeuvre Node Angle to Prograde |
- Manoeuvre Node Angle to Retrograde | - Manoeuvre Node Angle to Retrograde |
- Time to Manoeuvre Node | - Time to Manoeuvre Node |
- Time to Manoeuvre Burn | - Time to Manoeuvre Burn |
Added: Readout help strings by ClassyJakey. | Added: Readout help strings by ClassyJakey. |
Fixed: Issue with separators in HUDs. | Fixed: Issue with separators in HUDs. |
Fixed: Issue with HUDs with backgrounds that have no displayed lines. | Fixed: Issue with HUDs with backgrounds that have no displayed lines. |
Padishar's Fixes: | Padishar's Fixes: |
Fixed: Issue with multicouplers when attached to parent by bottom node. | Fixed: Issue with multicouplers when attached to parent by bottom node. |
Fixed: Issue with sepratrons on solid rocket boosters. | Fixed: Issue with sepratrons on solid rocket boosters. |
1.0.10.0, 19-10-2014 | 1.0.10.0, 19-10-2014 |
UPDATE NOTICE: If you are updating from a previous version of Kerbal Engineer 1.0, please | UPDATE NOTICE: If you are updating from a previous version of Kerbal Engineer 1.0, please |
delete the 'Settings/SectionLibrary.xml' file, or remove the old install first. This will | delete the 'Settings/SectionLibrary.xml' file, or remove the old install first. This will |
reset the Flight Engineer sections to their default values and enable the new HUD functionality. | reset the Flight Engineer sections to their default values and enable the new HUD functionality. |
Added: New reaouts to the vessel category: | Added: New reaouts to the vessel category: |
- Suicide Burn Altitude (height above terrain to start burn) | - Suicide Burn Altitude (height above terrain to start burn) |
- Suicide Burn Distance (distance to suicide burn altitude) | - Suicide Burn Distance (distance to suicide burn altitude) |
- Suicide Burn DeltaV (velocity change required to zero vertical speed) | - Suicide Burn DeltaV (velocity change required to zero vertical speed) |
*** F5 for safety and use at your own risk! *** | *** F5 for safety and use at your own risk! *** |
Added: HUD type sections to the Flight Engineer. | Added: HUD type sections to the Flight Engineer. |
Added: HUD sections can have a smoked background for easy visibility. | Added: HUD sections can have a smoked background for easy visibility. |
Added: 'Switch to Target' button on the Target Selector readout. | Added: 'Switch to Target' button on the Target Selector readout. |
Changed: The default installed readouts to reduce new user brain melt. | Changed: The default installed readouts to reduce new user brain melt. |
Fixed: Flight Engineer not saving its hidden state. | Fixed: Flight Engineer not saving its hidden state. |
Fixed: Bug in the phase angle calculations. | Fixed: Bug in the phase angle calculations. |
Fixed: Bug where the Build Engineer would stay locked after hiding with the shortcut key. | Fixed: Bug where the Build Engineer would stay locked after hiding with the shortcut key. |
1.0.9.3, 08-10-2014 | 1.0.9.3, 08-10-2014 |
Added: Title of the build engineer in compact mode now shows if you are using atmospheric data. | Added: Title of the build engineer in compact mode now shows if you are using atmospheric data. |
Added: New readout to the surface category: | Added: New readout to the surface category: |
- Vertical Acceleration | - Vertical Acceleration |
- Horizontal Acceleration | - Horizontal Acceleration |
Changed: Atmospheric efficiency readout now shows as a percentage. | Changed: Atmospheric efficiency readout now shows as a percentage. |
Changed: Atmospheric settings (pressure/velocity) in the editor condensed onto a single line. | Changed: Atmospheric settings (pressure/velocity) in the editor condensed onto a single line. |
Fixed: Bug where the overlays in the editor would stay open outside of parts screen. | Fixed: Bug where the overlays in the editor would stay open outside of parts screen. |
1.0.9.2, 07-10-2014 | 1.0.9.2, 07-10-2014 |
Updated for KSP v0.25.0 | Updated for KSP v0.25.0 |
Changed: Prettyfied Latitude and Longitude readouts. | Changed: Prettyfied Latitude and Longitude readouts. |
Changed: ModuleLandingGear now uses the physical significance flag. | Changed: ModuleLandingGear now uses the physical significance flag. |
Changed: Updated MiniAVC to 1.0.2.4. | Changed: Updated MiniAVC to 1.0.2.4. |
1.0.9.1, 17-09-2014 | 1.0.9.1, 17-09-2014 |
Fixed: Part size bug caused by TweakScale's cost calculator. | Fixed: Part size bug caused by TweakScale's cost calculator. |
1.0.9.0, 15-09-2014 | 1.0.9.0, 15-09-2014 |
Added: Build Engineer now also implements the '\' backslash show/hide shortcut. | Added: Build Engineer now also implements the '\' backslash show/hide shortcut. |
Added: New readouts to the vessel category: | Added: New readouts to the vessel category: |
- Current Stage DeltaV | - Current Stage DeltaV |
- Surface Thrust to Weight Ratio | - Surface Thrust to Weight Ratio |
Added: New editor overlay system. | Added: New editor overlay system. |
- Sleeker design. | - Sleeker design. |
- Hover over part information options: | - Hover over part information options: |
- Name only | - Name only |
- Middle click to show | - Middle click to show |
- Always show | - Always show |
- Slide out overlay displays: | - Slide out overlay displays: |
- Vessel information | - Vessel information |
- Resources list | - Resources list |
Fixed: Cost calculation now works with mods implementing IPartCostModifier. | Fixed: Cost calculation now works with mods implementing IPartCostModifier. |
1.0.8.1, 06-09-2014 | 1.0.8.1, 06-09-2014 |
Fixed: Bug which caused rendezvous readouts to freeze the game or show all zeros. | Fixed: Bug which caused rendezvous readouts to freeze the game or show all zeros. |
1.0.8.0, 06-09-2014 | 1.0.8.0, 06-09-2014 |
Added: New readouts to the vessel category: | Added: New readouts to the vessel category: |
- Intake Air (Usage) | - Intake Air (Usage) |
Added: New readouts to the rendezvous category: | Added: New readouts to the rendezvous category: |
- Relative Velocity | - Relative Velocity |
- Relative Speed | - Relative Speed |
Fixed: An issue where deltaV would not be calculated whilst flying. | Fixed: An issue where deltaV would not be calculated whilst flying. |
Fixed: NullRef whilst loading the in flight Action Menu. | Fixed: NullRef whilst loading the in flight Action Menu. |
1.0.7.1, 02-09-2014 | 1.0.7.1, 02-09-2014 |
Changed: Reversed Intake Air readout from 'S/D' to 'D/S' for easier reading. | Changed: Reversed Intake Air readout from 'S/D' to 'D/S' for easier reading. |
Changed: Increased Intake Air readout precision to 4 decimal places. | Changed: Increased Intake Air readout precision to 4 decimal places. |
Fixed: Issue where Intake Air supply was not representative of total supply. | Fixed: Issue where Intake Air supply was not representative of total supply. |
Fixed: Bug where actual thrust does not reset to zero on deactivated engines. | Fixed: Bug where actual thrust does not reset to zero on deactivated engines. |
Fixed: Thrust now scales with velocity for atmospheric engines. (Padishar's fix) | Fixed: Thrust now scales with velocity for atmospheric engines. (Padishar's fix) |
1.0.7.0, 01-09-2014 | 1.0.7.0, 01-09-2014 |
Added: Part count information to the Build Engineer. | Added: Part count information to the Build Engineer. |
Added: Reset button to the G-Force readout. | Added: Reset button to the G-Force readout. |
Added: Preset system to the Flight Engineer. | Added: Preset system to the Flight Engineer. |
Added: New stock presets: | Added: New stock presets: |
- Orbital | - Orbital |
- Surface | - Surface |
- Vessel | - Vessel |
- Rendezvous | - Rendezvous |
Added: New readouts to the orbital category: | Added: New readouts to the orbital category: |
- True Anomaly | - True Anomaly |
- Eccentric Anomaly | - Eccentric Anomaly |
- Mean Anomaly | - Mean Anomaly |
- Argument of Periapsis | - Argument of Periapsis |
- Angle to Prograde | - Angle to Prograde |
- Angle to Retrograde | - Angle to Retrograde |
Added: New readouts to the vessel category: | Added: New readouts to the vessel category: |
- Intake Air (Demand) | - Intake Air (Demand) |
- Intake Air (Supply) | - Intake Air (Supply) |
- Intake Air (Supply/Demand) | - Intake Air (Supply/Demand) |
Added: New readouts to the rendezvous category. | Added: New readouts to the rendezvous category. |
- Semi-major Axis | - Semi-major Axis |
- Semi-minor Axis | - Semi-minor Axis |
Added: Time formatter which can show time as referenced by any celestial body. | Added: Time formatter which can show time as referenced by any celestial body. |
Added: New readouts to the miscellaneous category: | Added: New readouts to the miscellaneous category: |
- Time Reference Adjuster | - Time Reference Adjuster |
Changed: Moved Sim Delay readout into the Miscellaneous category. | Changed: Moved Sim Delay readout into the Miscellaneous category. |
Changed: Updated MiniAVC to v1.0.2.3. | Changed: Updated MiniAVC to v1.0.2.3. |
Fixed: Issues with large value wrap around in the Flight Engineer. | Fixed: Issues with large value wrap around in the Flight Engineer. |
Fixed: Bug in the phase angle calculation. | Fixed: Bug in the phase angle calculation. |
1.0.6.0, 23-08-2014 | 1.0.6.0, 23-08-2014 |
Added: Time and Angle to equatorial ascending/descending nodes in the orbital display. | Added: Time and Angle to equatorial ascending/descending nodes in the orbital display. |
Added: Time and Angle to relative ascending/descending nodes in the rendezvous display. | Added: Time and Angle to relative ascending/descending nodes in the rendezvous display. |
Added: Overlay tooltip information delay adjustment slider to the Build Engineer settings. | Added: Overlay tooltip information delay adjustment slider to the Build Engineer settings. |
Added: Ability to rename the stock displays in the Flight Engineer. | Added: Ability to rename the stock displays in the Flight Engineer. |
Changed: Build Engineer is now hidden when not in parts view. | Changed: Build Engineer is now hidden when not in parts view. |
Changed: Custom display panels will only show in the control bar if an abbreviation is set. | Changed: Custom display panels will only show in the control bar if an abbreviation is set. |
Changed: Licensing and readme structures are now more verbose to satisfy the new add-on rules. | Changed: Licensing and readme structures are now more verbose to satisfy the new add-on rules. |
Fixed: Updated MiniAVC to v1.0.2.1 (fixes remote check bug as well as other minor bugs). | Fixed: Updated MiniAVC to v1.0.2.1 (fixes remote check bug as well as other minor bugs). |
1.0.5.0, 13-08-2014 | 1.0.5.0, 13-08-2014 |
Added: Acceleration readout to the Vessel category (current / maximum). | Added: Acceleration readout to the Vessel category (current / maximum). |
Added: Category library system for the Flight Engineer readouts. | Added: Category library system for the Flight Engineer readouts. |
Added: Drop-down category selection to better support the new system. | Added: Drop-down category selection to better support the new system. |
Changed: Misc category now called Miscellaneous (this will cause previously added readouts from this category to vanish). | Changed: Misc category now called Miscellaneous (this will cause previously added readouts from this category to vanish). |
Fixed: Bug with the Build Engineer toolbar button. | Fixed: Bug with the Build Engineer toolbar button. |
Fixed: Some buggyness when trying to close the bodies drop-down in the Build Engineer via the button. | Fixed: Some buggyness when trying to close the bodies drop-down in the Build Engineer via the button. |
Fixed: Flight Engineer toolbar menu now hides when hiding the GUI with F2. | Fixed: Flight Engineer toolbar menu now hides when hiding the GUI with F2. |
Fixed: Flight Engineer toolbar button now disables when in module mode and no engineer is running. | Fixed: Flight Engineer toolbar button now disables when in module mode and no engineer is running. |
1.0.4.0, 12-08-2014 | 1.0.4.0, 12-08-2014 |
Added: Better stock toolbar support in the flight engineer. | Added: Better stock toolbar support in the flight engineer. |
Added: Dynamically generated celestial body library for supporting add-ons that modify the star system. | Added: Dynamically generated celestial body library for supporting add-ons that modify the star system. |
Changed: Reference bodies are now listed with a nestable menu system. | Changed: Reference bodies are now listed with a nestable menu system. |
Changed: Extended logging system has been improved. | Changed: Extended logging system has been improved. |
Changed: Swapped out integrated MiniAVC in place of the official bundle version. | Changed: Swapped out integrated MiniAVC in place of the official bundle version. |
Changed: Increased general distance precision to 1 decimal place. | Changed: Increased general distance precision to 1 decimal place. |
Changed: Increased Semi-major/minor axis precision to 3 decimal places. | Changed: Increased Semi-major/minor axis precision to 3 decimal places. |
Fixed: Impact altitude was mistakenly formatted as an angle, it is now formatted correctly as a distance. | Fixed: Impact altitude was mistakenly formatted as an angle, it is now formatted correctly as a distance. |
1.0.3.0, 30-07-2014 | 1.0.3.0, 30-07-2014 |
Added: Integrated KSP-AVC support with MiniAVC. | Added: Integrated KSP-AVC support with MiniAVC. |
Added: Setting to change the simulation delay in the Build Engineer. | Added: Setting to change the simulation delay in the Build Engineer. |
Added: Setting to enable and disable the build overlay system. | Added: Setting to enable and disable the build overlay system. |
Added: Burn time to Delta-V readouts. | Added: Burn time to Delta-V readouts. |
Added: Atmospheric readouts fully support FAR. | Added: Atmospheric readouts fully support FAR. |
Added: Atmospheric readouts are disabled with NEAR. | Added: Atmospheric readouts are disabled with NEAR. |
Changed: Force formatting inversely scales decimal precision with value. | Changed: Force formatting inversely scales decimal precision with value. |
Fixed: Flickering in VAB and Vessel display. | Fixed: Flickering in VAB and Vessel display. |
Fixed: Bug saving the GUI display size. | Fixed: Bug saving the GUI display size. |
1.0.2.0, 27-07-2014 | 1.0.2.0, 27-07-2014 |
Added: Separator readout module under Misc in the Flight Engineer. | Added: Separator readout module under Misc in the Flight Engineer. |
Added: Adjustable GUI display size. | Added: Adjustable GUI display size. |
Added: Display size can be adjusted in the Build Engineer settings. | Added: Display size can be adjusted in the Build Engineer settings. |
Added: Misc readout for adjusting display size in the Flight Engineer. | Added: Misc readout for adjusting display size in the Flight Engineer. |
Changed: The rendezvous readout for the target's Orbital Period has higher precision. | Changed: The rendezvous readout for the target's Orbital Period has higher precision. |
Fixed: White toolbar icon by manually importing the texture if it cannot be found in the game database. | Fixed: White toolbar icon by manually importing the texture if it cannot be found in the game database. |
Fixed: Engines that have a minimum thrust are now calculated properly. (Thanks to nosscire.) | Fixed: Engines that have a minimum thrust are now calculated properly. (Thanks to nosscire.) |
Fixed: Compact collapse mode is now saved in the Build Engineer. | Fixed: Compact collapse mode is now saved in the Build Engineer. |
1.0.1.0, 26-07-2014 | 1.0.1.0, 26-07-2014 |
Added: Part-less Flight Engineer. | Added: Part-less Flight Engineer. |
Added: Ability to collapse the Build Engineer into compact mode from left or right. | Added: Ability to collapse the Build Engineer into compact mode from left or right. |
Added: Settings in Build Engineer for compact collapse mode and partless/module Flight Engineer. | Added: Settings in Build Engineer for compact collapse mode and partless/module Flight Engineer. |
Added: Biome, Impact Biome and Slope readouts. | Added: Biome, Impact Biome and Slope readouts. |
Added: Extra logging and exception handling. | Added: Extra logging and exception handling. |
Added: The original Engineer Chip part. | Added: The original Engineer Chip part. |
Added: "Show Engineer" toggle on the Flight Engineer toolbar. | Added: "Show Engineer" toggle on the Flight Engineer toolbar. |
Changed: Extended logging system now also writes to the standard KSP logs. | Changed: Extended logging system now also writes to the standard KSP logs. |
Changed: Extended logging saves next to the .dll file. | Changed: Extended logging saves next to the .dll file. |
Changed: ER7500 part has no physical significance. | Changed: ER7500 part has no physical significance. |
Fixed: ActionMenu and DisplayStack destruction bug. | Fixed: ActionMenu and DisplayStack destruction bug. |
1.0.0.1, 24-07-2014 | 1.0.0.1, 24-07-2014 |
Added: Stock toolbar support in the Flight Engineer. | Added: Stock toolbar support in the Flight Engineer. |
Changed: Orbital Period has higher precision. | Changed: Orbital Period has higher precision. |
Fixed: Various NullRefs in editor window and overlay. | Fixed: Various NullRefs in editor window and overlay. |
1.0.0.0, 24-07-2014 | 1.0.0.0, 24-07-2014 |
Initial release for public testing. | Initial release for public testing. |
<?xml version="1.0" encoding="utf-8"?> | |
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |
<PropertyGroup> | |
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |
<ProductVersion>10.0.20506</ProductVersion> | |
<SchemaVersion>2.0</SchemaVersion> | |
<ProjectGuid>{D7B7C6CE-6B5A-CE40-5B7C-9D0E6583E469}</ProjectGuid> | |
<OutputType>Library</OutputType> | |
<AssemblyName>Assembly-CSharp-Editor</AssemblyName> | |
<FileAlignment>512</FileAlignment> | |
<ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | |
<TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier> | |
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> | |
<TargetFrameworkProfile>Unity Full v3.5</TargetFrameworkProfile> | |
<CompilerResponseFile></CompilerResponseFile> | |
<UnityProjectType>Editor:5</UnityProjectType> | |
<UnityBuildTarget>WebPlayer:6</UnityBuildTarget> | |
<UnityVersion>5.2.4f1</UnityVersion> | |
<RootNamespace></RootNamespace> | |
<LangVersion Condition=" '$(VisualStudioVersion)' != '10.0' ">4</LangVersion> | |
</PropertyGroup> | |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |
<DebugType>pdbonly</DebugType> | |
<Optimize>false</Optimize> | |
<OutputPath>Temp\UnityVS_bin\Debug\</OutputPath> | |
<IntermediateOutputPath>Temp\UnityVS_obj\Debug\</IntermediateOutputPath> | |
<ErrorReport>prompt</ErrorReport> | |
<WarningLevel>4</WarningLevel> | |
<DefineConstants>DEBUG;TRACE;UNITY_5_2_4;UNITY_5_2;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_2D_PHYSICS;ENABLE_4_6_FEATURES;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_REFLECTION_BUFFERS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;UNITY_WEBPLAYER;ENABLE_SUBSTANCE;WEBPLUG;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN</DefineConstants> | |
<AllowUnsafeBlocks>false</AllowUnsafeBlocks> | |
</PropertyGroup> | |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |
<DebugType>pdbonly</DebugType> | |
<Optimize>false</Optimize> | |
<OutputPath>Temp\UnityVS_bin\Release\</OutputPath> | |
<IntermediateOutputPath>Temp\UnityVS_obj\Release\</IntermediateOutputPath> | |
<ErrorReport>prompt</ErrorReport> | |
<WarningLevel>4</WarningLevel> | |
<DefineConstants>TRACE;UNITY_5_2_4;UNITY_5_2;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_2D_PHYSICS;ENABLE_4_6_FEATURES;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_REFLECTION_BUFFERS;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;UNITY_WEBPLAYER;ENABLE_SUBSTANCE;WEBPLUG;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN</DefineConstants> | |
<AllowUnsafeBlocks>false</AllowUnsafeBlocks> | |
</PropertyGroup> | |
<ItemGroup> | |
<Reference Include="mscorlib" /> | |
<Reference Include="System" /> | |
<Reference Include="System.XML" /> | |
<Reference Include="System.Core" /> | |
<Reference Include="Boo.Lang" /> | |
<Reference Include="UnityScript.Lang" /> | |
<Reference Include="UnityEngine"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Advertisements"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Advertisements.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Advertisements"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Advertisements.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.UI"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.UI.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.UI"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.UI.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Networking"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Networking.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Networking"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Networking.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Analytics"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Analytics.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Graphs"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Graphs.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Android.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Android.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.iOS.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.iOS.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.WP8.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.WP8.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Metro.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Metro.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Tizen.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Tizen.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.SamsungTV.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.SamsungTV.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.WebGL.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.WebGL.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.LinuxStandalone.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.LinuxStandalone.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.WindowsStandalone.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.WindowsStandalone.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.OSXStandalone.Extensions"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.OSXStandalone.Extensions.dll</HintPath> | |
</Reference> | |
<Reference Include="SyntaxTree.VisualStudio.Unity.Bridge"> | |
<HintPath>Library\UnityAssemblies\SyntaxTree.VisualStudio.Unity.Bridge.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Networking"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Networking.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Advertisements"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Advertisements.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.UI"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.UI.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Analytics"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Analytics.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Networking"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Networking.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.Advertisements"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.Advertisements.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.UI"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.UI.dll</HintPath> | |
</Reference> | |
<Reference Include="Mono.Cecil"> | |
<HintPath>Library\UnityAssemblies\Mono.Cecil.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor.iOS.Extensions.Xcode"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.iOS.Extensions.Xcode.dll</HintPath> | |
</Reference> | |
</ItemGroup> | |
<ItemGroup> | |
<Compile Include="Assets\Scripts\Editor\BuildAssetBundles.cs" /> | |
</ItemGroup> | |
<Import Project="$(MSBuildExtensionsPath)\SyntaxTree\UnityVS\2015\UnityVS.CSharp.targets" /> | |
</Project> | |
<?xml version="1.0" encoding="utf-8"?> | |
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |
<PropertyGroup> | |
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |
<ProductVersion>10.0.20506</ProductVersion> | |
<SchemaVersion>2.0</SchemaVersion> | |
<ProjectGuid>{26D24EAD-1AF6-6749-D9C8-C47AEC4E6A98}</ProjectGuid> | |
<OutputType>Library</OutputType> | |
<AssemblyName>Assembly-CSharp</AssemblyName> | |
<FileAlignment>512</FileAlignment> | |
<ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | |
<TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier> | |
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> | |
<TargetFrameworkProfile>Unity Subset v3.5</TargetFrameworkProfile> | |
<CompilerResponseFile></CompilerResponseFile> | |
<UnityProjectType>Game:1</UnityProjectType> | |
<UnityBuildTarget>StandaloneWindows:5</UnityBuildTarget> | |
<UnityVersion>5.3.3p2</UnityVersion> | |
<RootNamespace></RootNamespace> | |
<LangVersion Condition=" '$(VisualStudioVersion)' != '10.0' ">4</LangVersion> | |
</PropertyGroup> | |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |
<DebugType>pdbonly</DebugType> | |
<Optimize>false</Optimize> | |
<OutputPath>Temp\UnityVS_bin\Debug\</OutputPath> | |
<IntermediateOutputPath>Temp\UnityVS_obj\Debug\</IntermediateOutputPath> | |
<ErrorReport>prompt</ErrorReport> | |
<WarningLevel>4</WarningLevel> | |
<DefineConstants>DEBUG;TRACE;UNITY_5_3_3;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN</DefineConstants> | |
<AllowUnsafeBlocks>false</AllowUnsafeBlocks> | |
</PropertyGroup> | |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |
<DebugType>pdbonly</DebugType> | |
<Optimize>false</Optimize> | |
<OutputPath>Temp\UnityVS_bin\Release\</OutputPath> | |
<IntermediateOutputPath>Temp\UnityVS_obj\Release\</IntermediateOutputPath> | |
<ErrorReport>prompt</ErrorReport> | |
<WarningLevel>4</WarningLevel> | |
<DefineConstants>TRACE;UNITY_5_3_3;UNITY_5_3;UNITY_5;ENABLE_NEW_BUGREPORTER;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_DUCK_TYPING;ENABLE_FRAME_DEBUGGER;ENABLE_GENERICS;ENABLE_HOME_SCREEN;ENABLE_IMAGEEFFECTS;ENABLE_LIGHT_PROBES_LEGACY;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_PLUGIN_INSPECTOR;ENABLE_SHADOWS;ENABLE_SINGLE_INSTANCE_BUILD_SETTING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_SPRITE_POLYGON;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_UNET;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;INCLUDE_IL2CPP;INCLUDE_DIRECTX12;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_LOCALIZATION;ENABLE_ANDROID_ATLAS_ETC1_COMPRESSION;ENABLE_EDITOR_TESTS_RUNNER;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_SUBSTANCE;ENABLE_TEXTUREID_MAP;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_LOG_MIXED_STACKTRACE;ENABLE_UNITYWEBREQUEST;ENABLE_EVENT_QUEUE;ENABLE_CLUSTERINPUT;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;ENABLE_PROFILER;DEBUG;TRACE;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN</DefineConstants> | |
<AllowUnsafeBlocks>false</AllowUnsafeBlocks> | |
</PropertyGroup> | |
<ItemGroup> | |
<Reference Include="mscorlib" /> | |
<Reference Include="System" /> | |
<Reference Include="System.XML" /> | |
<Reference Include="System.Core" /> | |
<Reference Include="Boo.Lang" /> | |
<Reference Include="UnityScript.Lang" /> | |
<Reference Include="System.Runtime.Serialization" /> | |
<Reference Include="System.Xml.Linq" /> | |
<Reference Include="UnityEngine"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.UI"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.UI.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Networking"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Networking.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.Networking"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.Networking.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEngine.UI"> | |
<HintPath>Library\UnityAssemblies\UnityEngine.UI.dll</HintPath> | |
</Reference> | |
<Reference Include="UnityEditor"> | |
<HintPath>Library\UnityAssemblies\UnityEditor.dll</HintPath> | |
</Reference> | |
</ItemGroup> | |
<ItemGroup> | |
<Compile Include="Assets\Scripts\BuildAssetBundles.cs" /> | |
</ItemGroup> | |
<Import Project="$(MSBuildExtensionsPath)\SyntaxTree\UnityVS\2015\UnityVS.CSharp.targets" /> | |
</Project> | |
| |
Microsoft Visual Studio Solution File, Format Version 12.00 | Microsoft Visual Studio Solution File, Format Version 12.00 |
# Visual Studio 2013 | # Visual Studio 2015 |
VisualStudioVersion = 12.0.30110.0 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KerbalEngineer.CSharp.Editor", "KerbalEngineer.CSharp.Editor.csproj", "{D7B7C6CE-6B5A-CE40-5B7C-9D0E6583E469}" |
MinimumVisualStudioVersion = 10.0.40219.1 | EndProject |
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KerbalEngineer", "KerbalEngineer\KerbalEngineer.csproj", "{39806613-E0B7-46E0-89A6-A569EC538CBB}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KerbalEngineer", "KerbalEngineer\KerbalEngineer.csproj", "{39806613-E0B7-46E0-89A6-A569EC538CBB}" |
EndProject | EndProject |
Global | Global |
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU |
Release|Any CPU = Release|Any CPU | Release|Any CPU = Release|Any CPU |
EndGlobalSection | EndGlobalSection |
GlobalSection(ProjectConfigurationPlatforms) = postSolution | GlobalSection(ProjectConfigurationPlatforms) = postSolution |
{D7B7C6CE-6B5A-CE40-5B7C-9D0E6583E469}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |
{D7B7C6CE-6B5A-CE40-5B7C-9D0E6583E469}.Debug|Any CPU.Build.0 = Debug|Any CPU | |
{D7B7C6CE-6B5A-CE40-5B7C-9D0E6583E469}.Release|Any CPU.ActiveCfg = Release|Any CPU | |
{D7B7C6CE-6B5A-CE40-5B7C-9D0E6583E469}.Release|Any CPU.Build.0 = Release|Any CPU | |
{39806613-E0B7-46E0-89A6-A569EC538CBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | {39806613-E0B7-46E0-89A6-A569EC538CBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
{39806613-E0B7-46E0-89A6-A569EC538CBB}.Debug|Any CPU.Build.0 = Debug|Any CPU | {39806613-E0B7-46E0-89A6-A569EC538CBB}.Debug|Any CPU.Build.0 = Debug|Any CPU |
{39806613-E0B7-46E0-89A6-A569EC538CBB}.Release|Any CPU.ActiveCfg = Release|Any CPU | {39806613-E0B7-46E0-89A6-A569EC538CBB}.Release|Any CPU.ActiveCfg = Release|Any CPU |
{39806613-E0B7-46E0-89A6-A569EC538CBB}.Release|Any CPU.Build.0 = Release|Any CPU | {39806613-E0B7-46E0-89A6-A569EC538CBB}.Release|Any CPU.Build.0 = Release|Any CPU |
EndGlobalSection | EndGlobalSection |
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution |
HideSolutionNode = FALSE | HideSolutionNode = FALSE |
EndGlobalSection | EndGlobalSection |
EndGlobal | EndGlobal |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2016 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
namespace KerbalEngineer | |
{ | |
using KSP.UI; | |
using KSP.UI.Screens; | |
using UnityEngine; | |
public class AppLauncherButton : MonoBehaviour | |
{ | |
private ApplicationLauncherButton m_Button; | |
/// <summary> | |
/// Gets or sets the toggle button state. | |
/// </summary> | |
public bool isOn | |
{ | |
get | |
{ | |
return m_Button != null && | |
m_Button.toggleButton.Button.interactable && | |
m_Button.toggleButton.CurrentState == UIRadioButton.State.True; | |
} | |
set | |
{ | |
if (m_Button == null) | |
{ | |
return; | |
} | |
if (value) | |
{ | |
SetOn(); | |
} | |
else | |
{ | |
SetOff(); | |
} | |
} | |
} | |
/// <summary> | |
/// Disables the button if not already disabled. | |
/// </summary> | |
public void Disable() | |
{ | |
if (m_Button != null && m_Button.toggleButton.Button.interactable) | |
{ | |
m_Button.Disable(); | |
} | |
} | |
/// <summary> | |
/// Enables the button if not already enabled. | |
/// </summary> | |
public void Enable() | |
{ | |
if (m_Button != null && m_Button.toggleButton.Button.interactable == false) | |
{ | |
m_Button.Enable(); | |
} | |
} | |
/// <summary> | |
/// Enables and sets the button to off. | |
/// </summary> | |
public void SetOff() | |
{ | |
Enable(); | |
if (m_Button != null && m_Button.toggleButton.CurrentState != UIRadioButton.State.False) | |
{ | |
m_Button.SetTrue(); | |
} | |
} | |
/// <summary> | |
/// Enables and sets the button to on. | |
/// </summary> | |
public void SetOn() | |
{ | |
Enable(); | |
if (m_Button != null && m_Button.toggleButton.CurrentState != UIRadioButton.State.True) | |
{ | |
m_Button.SetTrue(); | |
} | |
} | |
protected virtual void Awake() | |
{ | |
// subscribe event listeners | |
GameEvents.onGUIApplicationLauncherReady.Add(OnGUIApplicationLauncherReady); | |
GameEvents.onGUIApplicationLauncherUnreadifying.Add(OnGUIApplicationLauncherUnreadifying); | |
} | |
protected virtual void OnDestroy() | |
{ | |
// unsubscribe event listeners | |
GameEvents.onGUIApplicationLauncherReady.Remove(OnGUIApplicationLauncherReady); | |
GameEvents.onGUIApplicationLauncherUnreadifying.Remove(OnGUIApplicationLauncherUnreadifying); | |
} | |
/// <summary> | |
/// Called on button being disabled. | |
/// </summary> | |
protected virtual void OnDisable() { } | |
/// <summary> | |
/// Called on button being enabled. | |
/// </summary> | |
protected virtual void OnEnable() { } | |
/// <summary> | |
/// Called on button being toggled off. | |
/// </summary> | |
protected virtual void OnFalse() { } | |
/// <summary> | |
/// Called on mouse hovering. | |
/// </summary> | |
protected virtual void OnHover() { } | |
/// <summary> | |
/// Called on mouse exiting hover. | |
/// </summary> | |
protected virtual void OnHoverOut() { } | |
/// <summary> | |
/// Called on button being ready. | |
/// </summary> | |
protected virtual void OnReady() { } | |
/// <summary> | |
/// Called after the application launcher is ready and the button created. | |
/// </summary> | |
protected virtual void OnTrue() { } | |
/// <summary> | |
/// Called after the application launcher is unreadified and the button removed. | |
/// </summary> | |
protected virtual void OnUnreadifying() { } | |
private void OnGUIApplicationLauncherReady() | |
{ | |
// create button | |
if (ApplicationLauncher.Instance != null) | |
{ | |
Texture iconTexture = GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/ToolbarIcon", false); | |
m_Button = ApplicationLauncher.Instance.AddModApplication(OnTrue, OnFalse, OnHover, OnHoverOut, OnEnable, OnDisable, ApplicationLauncher.AppScenes.ALWAYS, iconTexture); | |
} | |
OnReady(); | |
} | |
private void OnGUIApplicationLauncherUnreadifying(GameScenes scene) | |
{ | |
// remove button | |
if (ApplicationLauncher.Instance != null && m_Button != null) | |
{ | |
ApplicationLauncher.Instance.RemoveModApplication(m_Button); | |
} | |
OnUnreadifying(); | |
} | |
} | |
} |
namespace KerbalEngineer | |
{ | |
using UnityEngine; | |
[KSPAddon(KSPAddon.Startup.Instantly, false)] | |
public class AssetBundleLoader : MonoBehaviour | |
{ | |
private static AssetBundle m_Images; | |
private static AssetBundle m_Prefabs; | |
/// <summary> | |
/// Gets the loaded images asset bundle. | |
/// </summary> | |
public static AssetBundle images | |
{ | |
get | |
{ | |
return m_Images; | |
} | |
} | |
/// <summary> | |
/// Gets the loaded prefabs asset bundle. | |
/// </summary> | |
public static AssetBundle prefabs | |
{ | |
get | |
{ | |
return m_Prefabs; | |
} | |
} | |
protected virtual void Awake() | |
{ | |
string bundlePath = EngineerGlobals.AssemblyPath; | |
m_Images = AssetBundle.CreateFromFile(bundlePath + "/images"); | |
m_Prefabs = AssetBundle.CreateFromFile(bundlePath + "/prefabs"); | |
} | |
} | |
} |
// | // |
// Kerbal Engineer Redux | // Copyright (C) 2015 CYBUTEK |
// | |
// Copyright (C) 2014 CYBUTEK | |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer.Editor | namespace KerbalEngineer.Editor |
{ | { |
#region Using Directives | |
using System; | using System; |
using Extensions; | using Extensions; |
using Flight; | using Flight; |
using Helpers; | using Helpers; |
using KeyBinding; | |
using Settings; | using Settings; |
using UIControls; | using UIControls; |
using UnityEngine; | using UnityEngine; |
using VesselSimulator; | using VesselSimulator; |
#endregion | |
[KSPAddon(KSPAddon.Startup.EditorAny, false)] | [KSPAddon(KSPAddon.Startup.EditorAny, false)] |
public class BuildAdvanced : MonoBehaviour | public class BuildAdvanced : MonoBehaviour |
{ | { |
#region Fields | public static float Altitude; |
public static float Altitude = 0.0f; | |
private static Rect compactModeRect = new Rect(0.0f, 5.0f, 0.0f, 20.0f); | |
private static Stage stage; | |
private static int stagesCount; | |
private static int stagesLength; | |
private static string title; | |
private GUIStyle areaSettingStyle; | private GUIStyle areaSettingStyle; |
private GUIStyle areaStyle; | private GUIStyle areaStyle; |
private float atmosphericMach; | private float atmosphericMach; |
private GUIStyle bodiesButtonActiveStyle; | private GUIStyle bodiesButtonActiveStyle; |
private GUIStyle bodiesButtonStyle; | private GUIStyle bodiesButtonStyle; |
private DropDown bodiesList; | private DropDown bodiesList; |
private Rect bodiesListPosition; | private Rect bodiesListPosition; |
private GUIStyle buttonStyle; | private GUIStyle buttonStyle; |
private int compactCheck; | private int compactCheck; |
private bool compactCollapseRight; | private bool compactCollapseRight; |
private bool compactMode; | private bool compactMode; |
private float compactRight; | private float compactRight; |
private bool hasChanged; | private bool hasChanged; |
private GUIStyle infoStyle; | private GUIStyle infoStyle; |
private bool isEditorLocked; | private bool isEditorLocked; |
private float maxMach; | private float maxMach; |
private int numberOfStages; | private int numberOfStages; |
private Rect position = new Rect(265.0f, 45.0f, 0, 0); | private Rect position = new Rect(265.0f, 45.0f, 0, 0); |
private GUIStyle settingAtmoStyle; | private GUIStyle settingAtmoStyle; |
private GUIStyle settingStyle; | private GUIStyle settingStyle; |
private bool showAllStages; | private bool showAllStages; |
private bool showAtmosphericDetails; | private bool showAtmosphericDetails; |
private bool showSettings; | private bool showSettings; |
private Stage[] stages; | private Stage[] stages; |
private GUIStyle titleStyle; | private GUIStyle titleStyle; |
private bool visible = true; | private bool visible = true; |
private GUIStyle windowStyle; | private GUIStyle windowStyle; |
#endregion | |
#region Properties | |
/// <summary> | /// <summary> |
/// Gets the current instance if started or returns null. | /// Gets the current instance if started or returns null. |
/// </summary> | /// </summary> |
public static BuildAdvanced Instance { get; private set; } | public static BuildAdvanced Instance { get; private set; } |
/// <summary> | /// <summary> |
/// Gets and sets whether to show in compact mode. | /// Gets and sets whether to show in compact mode. |
/// </summary> | /// </summary> |
public bool CompactMode | public bool CompactMode |
{ | { |
get | get |
{ | { |
return compactMode; | return compactMode; |
} | } |
set | set |
{ | { |
compactMode = value; | compactMode = value; |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets and sets whether to show all stages. | /// Gets and sets whether to show all stages. |
/// </summary> | /// </summary> |
public bool ShowAllStages | public bool ShowAllStages |
{ | { |
get | get |
{ | { |
return showAllStages; | return showAllStages; |
} | } |
set | set |
{ | { |
showAllStages = value; | showAllStages = value; |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets and sets whether to use atmospheric details. | /// Gets and sets whether to use atmospheric details. |
/// </summary> | /// </summary> |
public bool ShowAtmosphericDetails | public bool ShowAtmosphericDetails |
{ | { |
get | get |
{ | { |
return showAtmosphericDetails; | return showAtmosphericDetails; |
} | } |
set | set |
{ | { |
showAtmosphericDetails = value; | showAtmosphericDetails = value; |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets and sets whether to show the settings display. | /// Gets and sets whether to show the settings display. |
/// </summary> | /// </summary> |
public bool ShowSettings | public bool ShowSettings |
{ | { |
get | get |
{ | { |
return showSettings; | return showSettings; |
} | } |
set | set |
{ | { |
showSettings = value; | showSettings = value; |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets and sets whether the display is enabled. | /// Gets and sets whether the display is enabled. |
/// </summary> | /// </summary> |
public bool Visible | public bool Visible |
{ | { |
get | get |
{ | { |
return visible; | return visible; |
} | } |
set | set |
{ | { |
visible = value; | visible = value; |
} | } |
} | } |
#endregion | |
#region Methods | |
private static Rect compactModeRect = new Rect(0.0f, 5.0f, 0.0f, 20.0f); | |
private static Stage stage; | |
private static int stagesCount; | |
private static int stagesLength; | |
private static string title; | |
protected void Awake() | protected void Awake() |
{ | { |
try | try |
{ | { |
Instance = this; | Instance = this; |
bodiesList = gameObject.AddComponent<DropDown>(); | bodiesList = gameObject.AddComponent<DropDown>(); |
bodiesList.DrawCallback = DrawBodiesList; | bodiesList.DrawCallback = DrawBodiesList; |
Load(); | Load(); |
SimManager.UpdateModSettings(); | SimManager.UpdateModSettings(); |
SimManager.OnReady -= GetStageInfo; | SimManager.OnReady -= GetStageInfo; |
SimManager.OnReady += GetStageInfo; | SimManager.OnReady += GetStageInfo; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.Awake()"); | Logger.Exception(ex, "BuildAdvanced.Awake()"); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Saves the settings when this object is destroyed. | /// Saves the settings when this object is destroyed. |
/// </summary> | /// </summary> |
protected void OnDestroy() | protected void OnDestroy() |
{ | { |
Logger.Log("BuildAdvanced->OnDestroy"); | |
try | try |
{ | { |
SettingHandler handler = new SettingHandler(); | SettingHandler handler = new SettingHandler(); |
handler.Set("visible", visible); | handler.Set("visible", visible); |
handler.Set("windowPositionX", position.x); | handler.Set("windowPositionX", position.x); |
handler.Set("windowPositionY", position.y); | handler.Set("windowPositionY", position.y); |
handler.Set("compactMode", compactMode); | handler.Set("compactMode", compactMode); |
handler.Set("compactCollapseRight", compactCollapseRight); | handler.Set("compactCollapseRight", compactCollapseRight); |
handler.Set("showAllStages", showAllStages); | handler.Set("showAllStages", showAllStages); |
handler.Set("showAtmosphericDetails", showAtmosphericDetails); | handler.Set("showAtmosphericDetails", showAtmosphericDetails); |
handler.Set("showSettings", showSettings); | handler.Set("showSettings", showSettings); |
handler.Set("selectedBodyName", CelestialBodies.SelectedBody.Name); | handler.Set("selectedBodyName", CelestialBodies.SelectedBody.Name); |
handler.Save("BuildAdvanced.xml"); | handler.Save("BuildAdvanced.xml"); |
GuiDisplaySize.OnSizeChanged -= OnSizeChanged; | GuiDisplaySize.OnSizeChanged -= OnSizeChanged; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.OnDestroy()"); | Logger.Exception(ex, "BuildAdvanced.OnDestroy()"); |
} | } |
EditorLock(false); | |
} | } |
protected void OnGUI() | protected void OnGUI() |
{ | { |
try | try |
{ | { |
if (!visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorScreen.Parts) | if (!visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0 || EditorLogic.fetch.editorScreen != EditorScreen.Parts) |
{ | { |
return; | return; |
} | } |
if (stages == null) | if (stages == null) |
{ | { |
return; | return; |
} | } |
// Change the window title based on whether in compact mode or not. | // Change the window title based on whether in compact mode or not. |
title = !compactMode ? "KERBAL ENGINEER REDUX " + EngineerGlobals.ASSEMBLY_VERSION : "K.E.R. " + EngineerGlobals.ASSEMBLY_VERSION; | title = !compactMode ? "KERBAL ENGINEER REDUX " + EngineerGlobals.ASSEMBLY_VERSION : "K.E.R. " + EngineerGlobals.ASSEMBLY_VERSION; |
// Reset the window size when the staging or something else has changed. | // Reset the window size when the staging or something else has changed. |
stagesLength = stages.Length; | stagesLength = stages.Length; |
if (showAllStages) | if (showAllStages) |
{ | { |
stagesCount = stagesLength; | stagesCount = stagesLength; |
} | } |
if (showAllStages == false) | if (showAllStages == false) |
{ | { |
stagesCount = 0; | stagesCount = 0; |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
if (stages[i].deltaV > 0.0f) | if (stages[i].deltaV > 0.0f) |
{ | { |
stagesCount = stagesCount + 1; | stagesCount = stagesCount + 1; |
} | } |
} | } |
} | } |
if (hasChanged || stagesCount != numberOfStages) | if (hasChanged || stagesCount != numberOfStages) |
{ | { |
hasChanged = false; | hasChanged = false; |
numberOfStages = stagesCount; | numberOfStages = stagesCount; |
position.width = 0; | position.width = 0; |
position.height = 0; | position.height = 0; |
} | } |
GUI.skin = null; | GUI.skin = null; |
position = GUILayout.Window(GetInstanceID(), position, Window, title, windowStyle).ClampToScreen(); | position = GUILayout.Window(GetInstanceID(), position, Window, title, windowStyle).ClampToScreen(); |
if (compactCheck > 0 && compactCollapseRight) | if (compactCheck > 0 && compactCollapseRight) |
{ | { |
position.x = compactRight - position.width; | position.x = compactRight - position.width; |
compactCheck--; | compactCheck--; |
} | } |
else if (compactCheck > 0) | else if (compactCheck > 0) |
{ | { |
compactCheck = 0; | compactCheck = 0; |
} | } |
// Check editor lock to manage click-through. | // Check editor lock to manage click-through. |
CheckEditorLock(); | CheckEditorLock(); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.OnGUI()"); | Logger.Exception(ex, "BuildAdvanced.OnGUI()"); |
} | } |
} | } |
protected void Start() | protected void Start() |
{ | { |
try | try |
{ | { |
InitialiseStyles(); | InitialiseStyles(); |
GuiDisplaySize.OnSizeChanged += OnSizeChanged; | GuiDisplaySize.OnSizeChanged += OnSizeChanged; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.Start()"); | Logger.Exception(ex, "BuildAdvanced.Start()"); |
} | } |
} | } |
protected void Update() | protected void Update() |
{ | { |
try | try |
{ | { |
if (Input.GetKeyDown(KeyBinder.EditorShowHide)) | if (Input.GetKeyDown(KeyBinder.EditorShowHide)) |
{ | { |
visible = !visible; | visible = !visible; |
if (!visible) | if (!visible) |
{ | { |
EditorLock(false); | EditorLock(false); |
} | } |
} | } |
if (!visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0) | if (!visible || EditorLogic.fetch == null || EditorLogic.fetch.ship.parts.Count == 0) |
{ | { |
bodiesList.enabled = false; | bodiesList.enabled = false; |
return; | return; |
} | } |
// Configure the simulation parameters based on the selected reference body. | // Configure the simulation parameters based on the selected reference body. |
SimManager.Gravity = CelestialBodies.SelectedBody.Gravity; | SimManager.Gravity = CelestialBodies.SelectedBody.Gravity; |
if (showAtmosphericDetails) | if (showAtmosphericDetails) |
{ | { |
SimManager.Atmosphere = CelestialBodies.SelectedBody.GetAtmospheres(Altitude); | SimManager.Atmosphere = CelestialBodies.SelectedBody.GetAtmospheres(Altitude); |
} | } |
else | else |
{ | { |
SimManager.Atmosphere = 0; | SimManager.Atmosphere = 0; |
} | } |
SimManager.Mach = atmosphericMach; | SimManager.Mach = atmosphericMach; |
SimManager.RequestSimulation(); | SimManager.RequestSimulation(); |
SimManager.TryStartSimulation(); | SimManager.TryStartSimulation(); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.Update()"); | Logger.Exception(ex, "BuildAdvanced.Update()"); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Checks whether the editor should be locked to stop click-through. | /// Checks whether the editor should be locked to stop click-through. |
/// </summary> | /// </summary> |
private void CheckEditorLock() | private void CheckEditorLock() |
{ | { |
if ((position.MouseIsOver() || bodiesList.Position.MouseIsOver()) && !isEditorLocked) | if ((position.MouseIsOver() || bodiesList.Position.MouseIsOver()) && !isEditorLocked) |
{ | { |
EditorLock(true); | EditorLock(true); |
} | } |
else if (!position.MouseIsOver() && !bodiesList.Position.MouseIsOver() && isEditorLocked) | else if (!position.MouseIsOver() && !bodiesList.Position.MouseIsOver() && isEditorLocked) |
{ | { |
EditorLock(false); | EditorLock(false); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Draws the atmospheric settings. | /// Draws the atmospheric settings. |
/// </summary> | /// </summary> |
private void DrawAtmosphericDetails() | private void DrawAtmosphericDetails() |
{ | { |
try | try |
{ | { |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.BeginVertical(); | GUILayout.BeginVertical(); |
GUILayout.Label("Altitude: " + (Altitude * 0.001f).ToString("F1") + "km", settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset)); | GUILayout.Label("Altitude: " + (Altitude * 0.001f).ToString("F1") + "km", settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset)); |
GUI.skin = HighLogic.Skin; | GUI.skin = HighLogic.Skin; |
Altitude = GUILayout.HorizontalSlider(Altitude, 0.0f, (float)(CelestialBodies.SelectedBody.CelestialBody.atmosphereDepth)); | Altitude = GUILayout.HorizontalSlider(Altitude, 0.0f, (float)(CelestialBodies.SelectedBody.CelestialBody.atmosphereDepth)); |
GUI.skin = null; | GUI.skin = null; |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
GUILayout.Space(5.0f); | GUILayout.Space(5.0f); |
GUILayout.BeginVertical(); | GUILayout.BeginVertical(); |
GUILayout.Label("Mach: " + atmosphericMach.ToString("F2"), settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset)); | GUILayout.Label("Mach: " + atmosphericMach.ToString("F2"), settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset)); |
GUI.skin = HighLogic.Skin; | GUI.skin = HighLogic.Skin; |
atmosphericMach = GUILayout.HorizontalSlider(Mathf.Clamp(atmosphericMach, 0.0f, maxMach), 0.0f, maxMach); | atmosphericMach = GUILayout.HorizontalSlider(Mathf.Clamp(atmosphericMach, 0.0f, maxMach), 0.0f, maxMach); |
GUI.skin = null; | GUI.skin = null; |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.DrawAtmosphericDetails()"); | Logger.Exception(ex, "BuildAdvanced.DrawAtmosphericDetails()"); |
} | } |
} | } |
private void DrawBodiesList() | private void DrawBodiesList() |
{ | { |
if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody) | if (CelestialBodies.SystemBody == CelestialBodies.SelectedBody) |
{ | { |
DrawBody(CelestialBodies.SystemBody); | DrawBody(CelestialBodies.SystemBody); |
} | } |
else | else |
{ | { |
foreach (CelestialBodies.BodyInfo body in CelestialBodies.SystemBody.Children) | foreach (CelestialBodies.BodyInfo body in CelestialBodies.SystemBody.Children) |
{ | { |
DrawBody(body); | DrawBody(body); |
} | } |
} | } |
} | } |
private void DrawBody(CelestialBodies.BodyInfo bodyInfo, int depth = 0) | private void DrawBody(CelestialBodies.BodyInfo bodyInfo, int depth = 0) |
{ | { |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Space(20.0f * depth); | GUILayout.Space(20.0f * depth); |
if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? bodiesButtonActiveStyle : bodiesButtonStyle)) | if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? bodiesButtonActiveStyle : bodiesButtonStyle)) |
{ | { |
CelestialBodies.SetSelectedBody(bodyInfo.Name); | CelestialBodies.SetSelectedBody(bodyInfo.Name); |
Altitude = 0.0f; | Altitude = 0.0f; |
bodiesList.Resize = true; | bodiesList.Resize = true; |
} | } |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
if (bodyInfo.Selected) | if (bodyInfo.Selected) |
{ | { |
for (int i = 0; i < bodyInfo.Children.Count; ++i) | for (int i = 0; i < bodyInfo.Children.Count; ++i) |
{ | { |
DrawBody(bodyInfo.Children[i], depth + 1); | DrawBody(bodyInfo.Children[i], depth + 1); |
} | } |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Draws the burn time column. | /// Draws the burn time column. |
/// </summary> | /// </summary> |
private void DrawBurnTime() | private void DrawBurnTime() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("BURN", titleStyle); | GUILayout.Label("BURN", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(TimeFormatter.ConvertToString(stage.time), infoStyle); | GUILayout.Label(TimeFormatter.ConvertToString(stage.time), infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the cost column. | /// Draws the cost column. |
/// </summary> | /// </summary> |
private void DrawCost() | private void DrawCost() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("COST", titleStyle); | GUILayout.Label("COST", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(Units.Cost(stage.cost, stage.totalCost), infoStyle); | GUILayout.Label(Units.Cost(stage.cost, stage.totalCost), infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the deltaV column. | /// Draws the deltaV column. |
/// </summary> | /// </summary> |
private void DrawDeltaV() | private void DrawDeltaV() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("DELTA-V", titleStyle); | GUILayout.Label("DELTA-V", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(stage.deltaV.ToString("N0") + " / " + stage.inverseTotalDeltaV.ToString("N0") + "m/s", infoStyle); | GUILayout.Label(stage.deltaV.ToString("N0") + " / " + stage.inverseTotalDeltaV.ToString("N0") + "m/s", infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the specific impluse column. | /// Draws the specific impluse column. |
/// </summary> | /// </summary> |
private void DrawIsp() | private void DrawIsp() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("ISP", titleStyle); | GUILayout.Label("ISP", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(stage.isp.ToString("F1") + "s", infoStyle); | GUILayout.Label(stage.isp.ToString("F1") + "s", infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the mass column. | /// Draws the mass column. |
/// </summary> | /// </summary> |
private void DrawMass() | private void DrawMass() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(110.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("MASS", titleStyle); | GUILayout.Label("MASS", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(Units.ToMass(stage.mass, stage.totalMass), infoStyle); | GUILayout.Label(Units.ToMass(stage.mass, stage.totalMass), infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the part count column. | /// Draws the part count column. |
/// </summary> | /// </summary> |
private void DrawPartCount() | private void DrawPartCount() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(50.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(50.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("PARTS", titleStyle); | GUILayout.Label("PARTS", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(stage.partCount + " / " + stage.totalPartCount, infoStyle); | GUILayout.Label(stage.partCount + " / " + stage.totalPartCount, infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the settings panel. | /// Draws the settings panel. |
/// </summary> | /// </summary> |
private void DrawSettings() | private void DrawSettings() |
{ | { |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Compact mode collapses to the:", settingStyle); | GUILayout.Label("Compact mode collapses to the:", settingStyle); |
compactCollapseRight = !GUILayout.Toggle(!compactCollapseRight, "LEFT", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | compactCollapseRight = !GUILayout.Toggle(!compactCollapseRight, "LEFT", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
compactCollapseRight = GUILayout.Toggle(compactCollapseRight, "RIGHT", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | compactCollapseRight = GUILayout.Toggle(compactCollapseRight, "RIGHT", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Simulate using vectored thrust values:", settingStyle); | GUILayout.Label("Simulate using vectored thrust values:", settingStyle); |
SimManager.vectoredThrust = GUILayout.Toggle(SimManager.vectoredThrust, "ENABLED", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | SimManager.vectoredThrust = GUILayout.Toggle(SimManager.vectoredThrust, "ENABLED", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Verbose Simulation Log:", settingStyle); | GUILayout.Label("Verbose Simulation Log:", settingStyle); |
SimManager.logOutput = GUILayout.Toggle(SimManager.logOutput, "ENABLED", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | SimManager.logOutput = GUILayout.Toggle(SimManager.logOutput, "ENABLED", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Build Engineer Overlay:", settingStyle); | GUILayout.Label("Build Engineer Overlay:", settingStyle); |
BuildOverlay.Visible = GUILayout.Toggle(BuildOverlay.Visible, "VISIBLE", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | BuildOverlay.Visible = GUILayout.Toggle(BuildOverlay.Visible, "VISIBLE", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlayPartInfo.NamesOnly, "NAMES ONLY", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | BuildOverlayPartInfo.NamesOnly = GUILayout.Toggle(BuildOverlayPartInfo.NamesOnly, "NAMES ONLY", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
BuildOverlayPartInfo.ClickToOpen = GUILayout.Toggle(BuildOverlayPartInfo.ClickToOpen, "CLICK TO OPEN", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | BuildOverlayPartInfo.ClickToOpen = GUILayout.Toggle(BuildOverlayPartInfo.ClickToOpen, "CLICK TO OPEN", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Flight Engineer activation mode:", settingStyle); | GUILayout.Label("Flight Engineer activation mode:", settingStyle); |
FlightEngineerCore.IsCareerMode = GUILayout.Toggle(FlightEngineerCore.IsCareerMode, "CAREER", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | FlightEngineerCore.IsCareerMode = GUILayout.Toggle(FlightEngineerCore.IsCareerMode, "CAREER", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
FlightEngineerCore.IsCareerMode = !GUILayout.Toggle(!FlightEngineerCore.IsCareerMode, "PARTLESS", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | FlightEngineerCore.IsCareerMode = !GUILayout.Toggle(!FlightEngineerCore.IsCareerMode, "PARTLESS", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Flight Engineer Career Limitations:", settingStyle); | GUILayout.Label("Flight Engineer Career Limitations:", settingStyle); |
FlightEngineerCore.IsKerbalLimited = GUILayout.Toggle(FlightEngineerCore.IsKerbalLimited, "KERBAL", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | FlightEngineerCore.IsKerbalLimited = GUILayout.Toggle(FlightEngineerCore.IsKerbalLimited, "KERBAL", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
FlightEngineerCore.IsTrackingStationLimited = GUILayout.Toggle(FlightEngineerCore.IsTrackingStationLimited, "TRACKING", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | FlightEngineerCore.IsTrackingStationLimited = GUILayout.Toggle(FlightEngineerCore.IsTrackingStationLimited, "TRACKING", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
GUILayout.Label("Key Bindings:", settingStyle); | |
if (GUILayout.Button("EDIT KEY BINDINGS", buttonStyle, GUILayout.Width(200.0f * GuiDisplaySize.Offset))) | |
{ | |
KeyBinder.Show(); | |
} | |
GUILayout.EndHorizontal(); | |
GUILayout.BeginHorizontal(); | |
GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, settingStyle); | GUILayout.Label("GUI Size: " + GuiDisplaySize.Increment, settingStyle); |
if (GUILayout.Button("<", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset))) | if (GUILayout.Button("<", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset))) |
{ | { |
GuiDisplaySize.Increment--; | GuiDisplaySize.Increment--; |
} | } |
if (GUILayout.Button(">", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset))) | if (GUILayout.Button(">", buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset))) |
{ | { |
GuiDisplaySize.Increment++; | GuiDisplaySize.Increment++; |
} | } |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
GUILayout.Label("Minimum delay between simulations: " + SimManager.minSimTime.TotalMilliseconds + "ms", settingStyle); | GUILayout.Label("Minimum delay between simulations: " + SimManager.minSimTime.TotalMilliseconds + "ms", settingStyle); |
GUI.skin = HighLogic.Skin; | GUI.skin = HighLogic.Skin; |
SimManager.minSimTime = TimeSpan.FromMilliseconds(GUILayout.HorizontalSlider((float)SimManager.minSimTime.TotalMilliseconds, 0, 2000.0f)); | SimManager.minSimTime = TimeSpan.FromMilliseconds(GUILayout.HorizontalSlider((float)SimManager.minSimTime.TotalMilliseconds, 0, 2000.0f)); |
GUI.skin = null; | GUI.skin = null; |
} | } |
/// <summary> | /// <summary> |
/// Draws the stage number column. | /// Draws the stage number column. |
/// </summary> | /// </summary> |
private void DrawStageNumbers() | private void DrawStageNumbers() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(30.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(30.0f * GuiDisplaySize.Offset)); |
GUILayout.Label(string.Empty, titleStyle); | GUILayout.Label(string.Empty, titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label("S" + stage.number, titleStyle); | GUILayout.Label("S" + stage.number, titleStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the thrust column. | /// Draws the thrust column. |
/// </summary> | /// </summary> |
private void DrawThrust() | private void DrawThrust() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("THRUST", titleStyle); | GUILayout.Label("THRUST", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(stage.thrust.ToForce(), infoStyle); | GUILayout.Label(stage.thrust.ToForce(), infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Draws the torque column. | /// Draws the torque column. |
/// </summary> | /// </summary> |
private void DrawTorque() | private void DrawTorque() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(75.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("TORQUE", titleStyle); | GUILayout.Label("TORQUE", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(stage.maxThrustTorque.ToTorque(), infoStyle); | GUILayout.Label(stage.maxThrustTorque.ToTorque(), infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
/// <summary> | /// <summary> |
/// Drwas the thrust to weight ratio column. | /// Drwas the thrust to weight ratio column. |
/// </summary> | /// </summary> |
private void DrawTwr() | private void DrawTwr() |
{ | { |
GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset)); | GUILayout.BeginVertical(GUILayout.Width(100.0f * GuiDisplaySize.Offset)); |
GUILayout.Label("TWR (MAX)", titleStyle); | GUILayout.Label("TWR (MAX)", titleStyle); |
for (int i = 0; i < stagesLength; ++i) | for (int i = 0; i < stagesLength; ++i) |
{ | { |
stage = stages[i]; | stage = stages[i]; |
if (showAllStages || stage.deltaV > 0.0) | if (showAllStages || stage.deltaV > 0.0) |
{ | { |
GUILayout.Label(stage.thrustToWeight.ToString("F2") + " (" + stage.maxThrustToWeight.ToString("F2") + ")", infoStyle); | GUILayout.Label(stage.thrustToWeight.ToString("F2") + " (" + stage.maxThrustToWeight.ToString("F2") + ")", infoStyle); |
} | } |
} | } |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
private void EditorLock(bool state) | private void EditorLock(bool state) |
{ | { |
if (state) | if (state) |
{ | { |
InputLockManager.SetControlLock(ControlTypes.All, "KER_BuildAdvanced"); | InputLockManager.SetControlLock(ControlTypes.All, "KER_BuildAdvanced"); |
BuildOverlayPartInfo.Hidden = true; | BuildOverlayPartInfo.Hidden = true; |
isEditorLocked = true; | isEditorLocked = true; |
} | } |
else | else |
{ | { |
InputLockManager.SetControlLock(ControlTypes.None, "KER_BuildAdvanced"); | InputLockManager.SetControlLock(ControlTypes.None, "KER_BuildAdvanced"); |
BuildOverlayPartInfo.Hidden = false; | BuildOverlayPartInfo.Hidden = false; |
isEditorLocked = false; | isEditorLocked = false; |
} | } |
} | } |
private void GetStageInfo() | private void GetStageInfo() |
{ | { |
stages = SimManager.Stages; | stages = SimManager.Stages; |
if (stages != null && stages.Length > 0) | if (stages != null && stages.Length > 0) |
{ | { |
maxMach = stages[stages.Length - 1].maxMach; | maxMach = stages[stages.Length - 1].maxMach; |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Initialises all the styles that are required. | /// Initialises all the styles that are required. |
/// </summary> | /// </summary> |
private void InitialiseStyles() | private void InitialiseStyles() |
{ | { |
windowStyle = new GUIStyle(HighLogic.Skin.window) | windowStyle = new GUIStyle(HighLogic.Skin.window) |
{ | { |
alignment = TextAnchor.UpperLeft | alignment = TextAnchor.UpperLeft |
}; | }; |
areaStyle = new GUIStyle(HighLogic.Skin.box) | areaStyle = new GUIStyle(HighLogic.Skin.box) |
{ | { |
padding = new RectOffset(0, 0, 9, 0) | padding = new RectOffset(0, 0, 9, 0) |
}; | }; |
areaSettingStyle = new GUIStyle(HighLogic.Skin.box) | areaSettingStyle = new GUIStyle(HighLogic.Skin.box) |
{ | { |
padding = new RectOffset(10, 10, 10, 10) | padding = new RectOffset(10, 10, 10, 10) |
}; | }; |
buttonStyle = new GUIStyle(HighLogic.Skin.button) | buttonStyle = new GUIStyle(HighLogic.Skin.button) |
{ | { |
normal = | normal = |
{ | { |
textColor = Color.white | textColor = Color.white |
}, | }, |
fontSize = (int)(11 * GuiDisplaySize.Offset), | fontSize = (int)(11 * GuiDisplaySize.Offset), |
fontStyle = FontStyle.Bold, | fontStyle = FontStyle.Bold, |
alignment = TextAnchor.MiddleCenter | alignment = TextAnchor.MiddleCenter |
}; | }; |
titleStyle = new GUIStyle(HighLogic.Skin.label) | titleStyle = new GUIStyle(HighLogic.Skin.label) |
{ | { |
normal = | normal = |
{ | { |
textColor = Color.white | textColor = Color.white |
}, | }, |
fontSize = (int)(11 * GuiDisplaySize.Offset), | fontSize = (int)(11 * GuiDisplaySize.Offset), |
fontStyle = FontStyle.Bold, | fontStyle = FontStyle.Bold, |
alignment = TextAnchor.MiddleCenter, | alignment = TextAnchor.MiddleCenter, |
stretchWidth = true, | stretchWidth = true |
}; | }; |
infoStyle = new GUIStyle(HighLogic.Skin.label) | infoStyle = new GUIStyle(HighLogic.Skin.label) |
{ | { |
fontSize = (int)(11 * GuiDisplaySize.Offset), | fontSize = (int)(11 * GuiDisplaySize.Offset), |
fontStyle = FontStyle.Bold, | fontStyle = FontStyle.Bold, |
alignment = TextAnchor.MiddleCenter, | alignment = TextAnchor.MiddleCenter, |
stretchWidth = true | stretchWidth = true |
}; | }; |
settingStyle = new GUIStyle(titleStyle) | settingStyle = new GUIStyle(titleStyle) |
{ | { |
alignment = TextAnchor.MiddleLeft, | alignment = TextAnchor.MiddleLeft, |
stretchWidth = true, | stretchWidth = true, |
stretchHeight = true | stretchHeight = true |
}; | }; |
settingAtmoStyle = new GUIStyle(titleStyle) | settingAtmoStyle = new GUIStyle(titleStyle) |
{ | { |
margin = new RectOffset(), | margin = new RectOffset(), |
padding = new RectOffset(), | padding = new RectOffset(), |
alignment = TextAnchor.UpperLeft | alignment = TextAnchor.UpperLeft |
}; | }; |
bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button) | bodiesButtonStyle = new GUIStyle(HighLogic.Skin.button) |
{ | { |
margin = new RectOffset(0, 0, 2, 0), | margin = new RectOffset(0, 0, 2, 0), |
padding = new RectOffset(5, 5, 5, 5), | padding = new RectOffset(5, 5, 5, 5), |
normal = | normal = |
{ | { |
textColor = Color.white | textColor = Color.white |
}, | }, |
active = | active = |
{ | { |
textColor = Color.white | textColor = Color.white |
}, | }, |
fontSize = (int)(11 * GuiDisplaySize.Offset), | fontSize = (int)(11 * GuiDisplaySize.Offset), |
fontStyle = FontStyle.Bold, | fontStyle = FontStyle.Bold, |
alignment = TextAnchor.MiddleCenter, | alignment = TextAnchor.MiddleCenter, |
fixedHeight = 20.0f | fixedHeight = 20.0f |
}; | }; |
bodiesButtonActiveStyle = new GUIStyle(bodiesButtonStyle) | bodiesButtonActiveStyle = new GUIStyle(bodiesButtonStyle) |
{ | { |
normal = bodiesButtonStyle.onNormal, | normal = bodiesButtonStyle.onNormal, |
hover = bodiesButtonStyle.onHover | hover = bodiesButtonStyle.onHover |
}; | }; |
} | } |
/// <summary> | /// <summary> |
/// Loads the settings when this object is created. | /// Loads the settings when this object is created. |
/// </summary> | /// </summary> |
private void Load() | private void Load() |
{ | { |
try | try |
{ | { |
SettingHandler handler = SettingHandler.Load("BuildAdvanced.xml"); | SettingHandler handler = SettingHandler.Load("BuildAdvanced.xml"); |
handler.Get("visible", ref visible); | handler.Get("visible", ref visible); |
position.x = handler.Get("windowPositionX", position.x); | position.x = handler.Get("windowPositionX", position.x); |
position.y = handler.Get("windowPositionY", position.y); | position.y = handler.Get("windowPositionY", position.y); |
handler.Get("compactMode", ref compactMode); | handler.Get("compactMode", ref compactMode); |
handler.Get("compactCollapseRight", ref compactCollapseRight); | handler.Get("compactCollapseRight", ref compactCollapseRight); |
handler.Get("showAllStages", ref showAllStages); | handler.Get("showAllStages", ref showAllStages); |
handler.Get("showAtmosphericDetails", ref showAtmosphericDetails); | handler.Get("showAtmosphericDetails", ref showAtmosphericDetails); |
handler.Get("showSettings", ref showSettings); | handler.Get("showSettings", ref showSettings); |
CelestialBodies.SetSelectedBody(handler.Get("selectedBodyName", CelestialBodies.SelectedBody.Name)); | CelestialBodies.SetSelectedBody(handler.Get("selectedBodyName", CelestialBodies.SelectedBody.Name)); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.Load()"); | Logger.Exception(ex, "BuildAdvanced.Load()"); |
} | } |
} | } |
private void OnSizeChanged() | private void OnSizeChanged() |
{ | { |
InitialiseStyles(); | InitialiseStyles(); |
hasChanged = true; | hasChanged = true; |
} | } |
/// <summary> | /// <summary> |
/// Draws the OnGUI window. | /// Draws the OnGUI window. |
/// </summary> | /// </summary> |
private void Window(int windowId) | private void Window(int windowId) |
{ | { |
try | try |
{ | { |
compactModeRect = new Rect(position.width - 70.0f * GuiDisplaySize.Offset, 5.0f, 65.0f * GuiDisplaySize.Offset, 20.0f); | compactModeRect = new Rect(position.width - 70.0f * GuiDisplaySize.Offset, 5.0f, 65.0f * GuiDisplaySize.Offset, 20.0f); |
// Draw the compact mode toggle. | // Draw the compact mode toggle. |
if (GUI.Toggle(compactModeRect, compactMode, "COMPACT", buttonStyle) != compactMode) | if (GUI.Toggle(compactModeRect, compactMode, "COMPACT", buttonStyle) != compactMode) |
{ | { |
hasChanged = true; | hasChanged = true; |
compactCheck = 2; | compactCheck = 2; |
compactRight = position.xMax; | compactRight = position.xMax; |
compactMode = !compactMode; | compactMode = !compactMode; |
} | } |
// When not in compact mode draw the 'All Stages' and 'Atmospheric' toggles. | // When not in compact mode draw the 'All Stages' and 'Atmospheric' toggles. |
if (!compactMode) | if (!compactMode) |
{ | { |
if (GUI.Toggle(new Rect(position.width - 143.0f * GuiDisplaySize.Offset, 5.0f, 70.0f * GuiDisplaySize.Offset, 20.0f), showSettings, "SETTINGS", buttonStyle) != showSettings) | if (GUI.Toggle(new Rect(position.width - 143.0f * GuiDisplaySize.Offset, 5.0f, 70.0f * GuiDisplaySize.Offset, 20.0f), showSettings, "SETTINGS", buttonStyle) != showSettings) |
{ | { |
hasChanged = true; | hasChanged = true; |
showSettings = !showSettings; | showSettings = !showSettings; |
} | } |
if (GUI.Toggle(new Rect(position.width - 226.0f * GuiDisplaySize.Offset, 5.0f, 80.0f * GuiDisplaySize.Offset, 20.0f), showAllStages, "ALL STAGES", buttonStyle) != showAllStages) | if (GUI.Toggle(new Rect(position.width - 226.0f * GuiDisplaySize.Offset, 5.0f, 80.0f * GuiDisplaySize.Offset, 20.0f), showAllStages, "ALL STAGES", buttonStyle) != showAllStages) |
{ | { |
hasChanged = true; | hasChanged = true; |
showAllStages = !showAllStages; | showAllStages = !showAllStages; |
} | } |
if (GUI.Toggle(new Rect(position.width - 324.0f * GuiDisplaySize.Offset, 5.0f, 95.0f * GuiDisplaySize.Offset, 20.0f), showAtmosphericDetails, "ATMOSPHERIC", buttonStyle) != showAtmosphericDetails) | if (GUI.Toggle(new Rect(position.width - 324.0f * GuiDisplaySize.Offset, 5.0f, 95.0f * GuiDisplaySize.Offset, 20.0f), showAtmosphericDetails, "ATMOSPHERIC", buttonStyle) != showAtmosphericDetails) |
{ | { |
hasChanged = true; | hasChanged = true; |
showAtmosphericDetails = !showAtmosphericDetails; | showAtmosphericDetails = !showAtmosphericDetails; |
} | } |
bodiesListPosition = new Rect(position.width - 452.0f * GuiDisplaySize.Offset, 5.0f, 125.0f * GuiDisplaySize.Offset, 20.0f); | bodiesListPosition = new Rect(position.width - 452.0f * GuiDisplaySize.Offset, 5.0f, 125.0f * GuiDisplaySize.Offset, 20.0f); |
bodiesList.enabled = GUI.Toggle(bodiesListPosition, bodiesList.enabled, "BODY: " + CelestialBodies.SelectedBody.Name.ToUpper(), buttonStyle); | bodiesList.enabled = GUI.Toggle(bodiesListPosition, bodiesList.enabled, "BODY: " + CelestialBodies.SelectedBody.Name.ToUpper(), buttonStyle); |
bodiesList.SetPosition(bodiesListPosition.Translate(position)); | bodiesList.SetPosition(bodiesListPosition.Translate(position)); |
} | } |
else | else |
{ | { |
if (GUI.Toggle(new Rect(position.width - 133.0f * GuiDisplaySize.Offset, 5.0f, 60.0f * GuiDisplaySize.Offset, 20.0f), showAtmosphericDetails, "ATMO", buttonStyle) != showAtmosphericDetails) | if (GUI.Toggle(new Rect(position.width - 133.0f * GuiDisplaySize.Offset, 5.0f, 60.0f * GuiDisplaySize.Offset, 20.0f), showAtmosphericDetails, "ATMO", buttonStyle) != showAtmosphericDetails) |
{ | { |
hasChanged = true; | hasChanged = true; |
showAtmosphericDetails = !showAtmosphericDetails; | showAtmosphericDetails = !showAtmosphericDetails; |
} | } |
} | } |
// Draw the main informational display box. | // Draw the main informational display box. |
if (!compactMode) | if (!compactMode) |
{ | { |
GUILayout.BeginHorizontal(areaStyle); | GUILayout.BeginHorizontal(areaStyle); |
DrawStageNumbers(); | DrawStageNumbers(); |
DrawPartCount(); | DrawPartCount(); |
DrawCost(); | DrawCost(); |
DrawMass(); | DrawMass(); |
DrawIsp(); | DrawIsp(); |
DrawThrust(); | DrawThrust(); |
DrawTorque(); | DrawTorque(); |
DrawTwr(); | DrawTwr(); |
DrawDeltaV(); | DrawDeltaV(); |
DrawBurnTime(); | DrawBurnTime(); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
if (showAtmosphericDetails && !compactMode) | if (showAtmosphericDetails && !compactMode) |
{ | { |
GUILayout.BeginVertical(areaSettingStyle); | GUILayout.BeginVertical(areaSettingStyle); |
DrawAtmosphericDetails(); | DrawAtmosphericDetails(); |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
if (showSettings) | if (showSettings) |
{ | { |
GUILayout.BeginVertical(areaSettingStyle); | GUILayout.BeginVertical(areaSettingStyle); |
DrawSettings(); | DrawSettings(); |
GUILayout.EndVertical(); | GUILayout.EndVertical(); |
} | } |
} | } |
else // Draw only a few details when in compact mode. | else // Draw only a few details when in compact mode. |
{ | { |
GUILayout.BeginHorizontal(areaStyle); | GUILayout.BeginHorizontal(areaStyle); |
DrawStageNumbers(); | DrawStageNumbers(); |
DrawTwr(); | DrawTwr(); |
DrawDeltaV(); | DrawDeltaV(); |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
} | } |
GUI.DragWindow(); | GUI.DragWindow(); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "BuildAdvanced.Window()"); | Logger.Exception(ex, "BuildAdvanced.Window()"); |
} | } |
} | } |
#endregion | |
} | } |
} | } |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2016 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
namespace KerbalEngineer.Editor | |
{ | |
[KSPAddon(KSPAddon.Startup.EditorAny, false)] | |
public class BuildAppLauncher : AppLauncherButton | |
{ | |
protected override void OnFalse() | |
{ | |
if (BuildAdvanced.Instance != null) | |
{ | |
BuildAdvanced.Instance.Visible = false; | |
} | |
} | |
protected override void OnTrue() | |
{ | |
if (BuildAdvanced.Instance != null) | |
{ | |
BuildAdvanced.Instance.Visible = true; | |
} | |
} | |
protected virtual void Update() | |
{ | |
if (BuildAdvanced.Instance == null) | |
{ | |
return; | |
} | |
// check if vessel is currently under construction with the presence of a root part | |
if (EditorLogic.RootPart != null) | |
{ | |
// set button state based on existing visibility | |
isOn = BuildAdvanced.Instance.Visible; | |
} | |
else | |
{ | |
Disable(); | |
} | |
} | |
} | |
} |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer.Editor | namespace KerbalEngineer.Editor |
{ | { |
using System; | using System; |
using System.Collections.Generic; | using System.Collections.Generic; |
using Extensions; | using Extensions; |
using Helpers; | using Helpers; |
using UnityEngine; | using UnityEngine; |
public class BuildOverlayPartInfo : MonoBehaviour | public class BuildOverlayPartInfo : MonoBehaviour |
{ | { |
private static bool clickToOpen = true; | private static bool clickToOpen = true; |
private static ModuleGenerator.GeneratorResource generatorResource; | private static ModuleResource generatorResource; |
private static ModuleAlternator moduleAlternator; | private static ModuleAlternator moduleAlternator; |
private static ModuleDataTransmitter moduleDataTransmitter; | private static ModuleDataTransmitter moduleDataTransmitter; |
private static ModuleDeployableSolarPanel moduleDeployableSolarPanel; | private static ModuleDeployableSolarPanel moduleDeployableSolarPanel; |
private static ModuleGenerator moduleGenerator; | private static ModuleGenerator moduleGenerator; |
private static ModuleGimbal moduleGimbal; | private static ModuleGimbal moduleGimbal; |
private static ModuleParachute moduleParachute; | private static ModuleParachute moduleParachute; |
private static ModuleRCS moduleRcs; | private static ModuleRCS moduleRcs; |
private static ModuleReactionWheel moduleReactionWheel; | private static ModuleReactionWheel moduleReactionWheel; |
private static ModuleResource moduleResource; | private static ModuleResource moduleResource; |
private static ModuleScienceExperiment moduleScienceExperiment; | private static ModuleScienceExperiment moduleScienceExperiment; |
private static bool namesOnly; | private static bool namesOnly; |
private static Part part; | private static Part part; |
private static PartInfoItem partInfoItem; | private static PartInfoItem partInfoItem; |
private static PartResource partResource; | private static PartResource partResource; |
private static Propellant propellant; | private static Propellant propellant; |
private static PartExtensions.ProtoModuleDecoupler protoModuleDecoupler; | private static PartExtensions.ProtoModuleDecoupler protoModuleDecoupler; |
private static PartExtensions.ProtoModuleEngine protoModuleEngine; | private static PartExtensions.ProtoModuleEngine protoModuleEngine; |
private static bool visible = true; | private static bool visible = true; |
private readonly List<PartInfoItem> infoItems = new List<PartInfoItem>(); | private readonly List<PartInfoItem> infoItems = new List<PartInfoItem>(); |
private Rect position; | private Rect position; |
private Part selectedPart; | private Part selectedPart; |
private bool showInfo; | private bool showInfo; |
private bool skipFrame; | private bool skipFrame; |
public static bool ClickToOpen | public static bool ClickToOpen |
{ | { |
get | get |
{ | { |
return clickToOpen; | return clickToOpen; |
} | } |
set | set |
{ | { |
clickToOpen = value; | clickToOpen = value; |
} | } |
} | } |
public static bool Hidden { get; set; } | public static bool Hidden { get; set; } |
public static bool NamesOnly | public static bool NamesOnly |
{ | { |
get | get |
{ | { |
return namesOnly; | return namesOnly; |
} | } |
set | set |
{ | { |
namesOnly = value; | namesOnly = value; |
} | } |
} | } |
public static bool Visible | public static bool Visible |
{ | { |
get | get |
{ | { |
return visible; | return visible; |
} | } |
set | set |
{ | { |
visible = value; | visible = value; |
} | } |
} | } |
protected void OnGUI() | protected void OnGUI() |
{ | { |
try | try |
{ | { |
if (!Visible || Hidden || selectedPart == null) | if (!Visible || Hidden || selectedPart == null) |
{ | { |
return; | return; |
} | } |
position = GUILayout.Window(GetInstanceID(), position, Window, String.Empty, BuildOverlay.WindowStyle); | position = GUILayout.Window(GetInstanceID(), position, Window, String.Empty, BuildOverlay.WindowStyle); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
protected void Update() | protected void Update() |
{ | { |
try | try |
{ | { |
if (!Visible || Hidden || EditorLogic.RootPart == null || EditorLogic.fetch.editorScreen != EditorScreen.Parts) | if (!Visible || Hidden || EditorLogic.RootPart == null || EditorLogic.fetch.editorScreen != EditorScreen.Parts) |
{ | { |
return; | return; |
} | } |
position.x = Mathf.Clamp(Input.mousePosition.x + 16.0f, 0.0f, Screen.width - position.width); | position.x = Mathf.Clamp(Input.mousePosition.x + 16.0f, 0.0f, Screen.width - position.width); |
position.y = Mathf.Clamp(Screen.height - Input.mousePosition.y, 0.0f, Screen.height - position.height); | position.y = Mathf.Clamp(Screen.height - Input.mousePosition.y, 0.0f, Screen.height - position.height); |
if (position.x < Input.mousePosition.x + 20.0f) | if (position.x < Input.mousePosition.x + 20.0f) |
{ | { |
position.y = Mathf.Clamp(position.y + 20.0f, 0.0f, Screen.height - position.height); | position.y = Mathf.Clamp(position.y + 20.0f, 0.0f, Screen.height - position.height); |
} | } |
if (position.x < Input.mousePosition.x + 16.0f && position.y < Screen.height - Input.mousePosition.y) | if (position.x < Input.mousePosition.x + 16.0f && position.y < Screen.height - Input.mousePosition.y) |
{ | { |
position.x = Input.mousePosition.x - 3 - position.width; | position.x = Input.mousePosition.x - 3 - position.width; |
} | } |
part = EditorLogic.fetch.ship.parts.Find(p => p.stackIcon.highlightIcon) ?? EditorLogic.SelectedPart; | part = EditorLogic.fetch.ship.parts.Find(p => p.stackIcon.Highlighted) ?? EditorLogic.SelectedPart; |
if (part != null) | if (part != null) |
{ | { |
if (!part.Equals(selectedPart)) | if (!part.Equals(selectedPart)) |
{ | { |
selectedPart = part; | selectedPart = part; |
ResetInfo(); | ResetInfo(); |
} | } |
if (NamesOnly || skipFrame) | if (NamesOnly || skipFrame) |
{ | { |
skipFrame = false; | skipFrame = false; |
return; | return; |
} | } |
if (!showInfo && Input.GetMouseButtonDown(2)) | if (!showInfo && Input.GetMouseButtonDown(2)) |
{ | { |
showInfo = true; | showInfo = true; |
} | } |
else if (ClickToOpen && showInfo && Input.GetMouseButtonDown(2)) | else if (ClickToOpen && showInfo && Input.GetMouseButtonDown(2)) |
{ | { |
ResetInfo(); | ResetInfo(); |
} | } |
if (showInfo) | if (showInfo) |
{ | { |
PartInfoItem.Release(infoItems); | PartInfoItem.Release(infoItems); |
infoItems.Clear(); | infoItems.Clear(); |
SetCostInfo(); | SetCostInfo(); |
SetMassItems(); | SetMassItems(); |
SetResourceItems(); | SetResourceItems(); |
SetEngineInfo(); | SetEngineInfo(); |
SetAlternatorInfo(); | SetAlternatorInfo(); |
SetGimbalInfo(); | SetGimbalInfo(); |
SetRcsInfo(); | SetRcsInfo(); |
SetParachuteInfo(); | SetParachuteInfo(); |
SetSasInfo(); | SetSasInfo(); |
SetReactionWheelInfo(); | SetReactionWheelInfo(); |
SetSolarPanelInfo(); | SetSolarPanelInfo(); |
SetGeneratorInfo(); | SetGeneratorInfo(); |
SetDecouplerInfo(); | SetDecouplerInfo(); |
SetTransmitterInfo(); | SetTransmitterInfo(); |
SetScienceExperimentInfo(); | SetScienceExperimentInfo(); |
SetScienceContainerInfo(); | SetScienceContainerInfo(); |
SetSingleActivationInfo(); | SetSingleActivationInfo(); |
} | } |
} | } |
else | else |
{ | { |
selectedPart = null; | selectedPart = null; |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void ResetInfo() | private void ResetInfo() |
{ | { |
showInfo = !clickToOpen; | showInfo = !clickToOpen; |
skipFrame = true; | skipFrame = true; |
position.width = namesOnly || clickToOpen ? 0.0f : 200.0f; | position.width = namesOnly || clickToOpen ? 0.0f : 200.0f; |
position.height = 0.0f; | position.height = 0.0f; |
} | } |
private void SetAlternatorInfo() | private void SetAlternatorInfo() |
{ | { |
moduleAlternator = selectedPart.GetModule<ModuleAlternator>(); | moduleAlternator = selectedPart.GetModule<ModuleAlternator>(); |
if (moduleAlternator != null) | if (moduleAlternator != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Alternator")); | infoItems.Add(PartInfoItem.Create("Alternator")); |
for (int i = 0; i < moduleAlternator.outputResources.Count; ++i) | for (int i = 0; i < moduleAlternator.outputResources.Count; ++i) |
{ | { |
moduleResource = moduleAlternator.outputResources[i]; | moduleResource = moduleAlternator.outputResources[i]; |
infoItems.Add(PartInfoItem.Create("\t" + moduleResource.name, moduleResource.rate.ToRate())); | infoItems.Add(PartInfoItem.Create("\t" + moduleResource.name, moduleResource.rate.ToRate())); |
} | } |
} | } |
} | } |
private void SetCostInfo() | private void SetCostInfo() |
{ | { |
infoItems.Add(PartInfoItem.Create("Cost", Units.ConcatF(selectedPart.GetCostDry(), selectedPart.GetCostWet()))); | infoItems.Add(PartInfoItem.Create("Cost", Units.ConcatF(selectedPart.GetCostDry(), selectedPart.GetCostWet()))); |
} | } |
private void SetDecouplerInfo() | private void SetDecouplerInfo() |
{ | { |
protoModuleDecoupler = selectedPart.GetProtoModuleDecoupler(); | protoModuleDecoupler = selectedPart.GetProtoModuleDecoupler(); |
if (protoModuleDecoupler != null) | if (protoModuleDecoupler != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Ejection Force", protoModuleDecoupler.EjectionForce.ToForce())); | infoItems.Add(PartInfoItem.Create("Ejection Force", protoModuleDecoupler.EjectionForce.ToForce())); |
if (protoModuleDecoupler.IsOmniDecoupler) | if (protoModuleDecoupler.IsOmniDecoupler) |
{ | { |
infoItems.Add(PartInfoItem.Create("Omni-directional")); | infoItems.Add(PartInfoItem.Create("Omni-directional")); |
} | } |
} | } |
} | } |
private void SetEngineInfo() | private void SetEngineInfo() |
{ | { |
protoModuleEngine = selectedPart.GetProtoModuleEngine(); | protoModuleEngine = selectedPart.GetProtoModuleEngine(); |
if (protoModuleEngine != null) | if (protoModuleEngine != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Thrust", Units.ToForce(protoModuleEngine.MinimumThrust, protoModuleEngine.MaximumThrust))); | infoItems.Add(PartInfoItem.Create("Thrust", Units.ToForce(protoModuleEngine.MinimumThrust, protoModuleEngine.MaximumThrust))); |
infoItems.Add(PartInfoItem.Create("Isp", Units.ConcatF(protoModuleEngine.GetSpecificImpulse(1.0f), protoModuleEngine.GetSpecificImpulse(0.0f)) + "s")); | infoItems.Add(PartInfoItem.Create("Isp", Units.ConcatF(protoModuleEngine.GetSpecificImpulse(1.0f), protoModuleEngine.GetSpecificImpulse(0.0f)) + "s")); |
if (protoModuleEngine.Propellants.Count > 0) | if (protoModuleEngine.Propellants.Count > 0) |
{ | { |
infoItems.Add(PartInfoItem.Create("Propellants")); | infoItems.Add(PartInfoItem.Create("Propellants")); |
float totalRatio = 0.0f; | float totalRatio = 0.0f; |
for (int i = 0; i < protoModuleEngine.Propellants.Count; ++i) | for (int i = 0; i < protoModuleEngine.Propellants.Count; ++i) |
{ | { |
totalRatio = totalRatio + protoModuleEngine.Propellants[i].ratio; | totalRatio = totalRatio + protoModuleEngine.Propellants[i].ratio; |
} | } |
for (int i = 0; i < protoModuleEngine.Propellants.Count; ++i) | for (int i = 0; i < protoModuleEngine.Propellants.Count; ++i) |
{ | { |
propellant = protoModuleEngine.Propellants[i]; | propellant = protoModuleEngine.Propellants[i]; |
infoItems.Add(PartInfoItem.Create("\t" + propellant.name, (propellant.ratio / totalRatio).ToPercent())); | infoItems.Add(PartInfoItem.Create("\t" + propellant.name, (propellant.ratio / totalRatio).ToPercent())); |
} | } |
} | } |
} | } |
} | } |
private void SetGeneratorInfo() | private void SetGeneratorInfo() |
{ | { |
moduleGenerator = selectedPart.GetModule<ModuleGenerator>(); | moduleGenerator = selectedPart.GetModule<ModuleGenerator>(); |
if (moduleGenerator != null) | if (moduleGenerator != null) |
{ | { |
if (moduleGenerator.inputList.Count > 0) | if (moduleGenerator.inputList.Count > 0) |
{ | { |
infoItems.Add(PartInfoItem.Create("Generator Input")); | infoItems.Add(PartInfoItem.Create("Generator Input")); |
for (int i = 0; i < moduleGenerator.inputList.Count; ++i) | for (int i = 0; i < moduleGenerator.inputList.Count; ++i) |
{ | { |
generatorResource = moduleGenerator.inputList[i]; | generatorResource = moduleGenerator.inputList[i]; |
infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); | infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); |
} | } |
} | } |
if (moduleGenerator.outputList.Count > 0) | if (moduleGenerator.outputList.Count > 0) |
{ | { |
infoItems.Add(PartInfoItem.Create("Generator Output")); | infoItems.Add(PartInfoItem.Create("Generator Output")); |
for (int i = 0; i < moduleGenerator.outputList.Count; ++i) | for (int i = 0; i < moduleGenerator.outputList.Count; ++i) |
{ | { |
generatorResource = moduleGenerator.outputList[i]; | generatorResource = moduleGenerator.outputList[i]; |
infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); | infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); |
} | } |
} | } |
if (moduleGenerator.isAlwaysActive) | if (moduleGenerator.isAlwaysActive) |
{ | { |
infoItems.Add(PartInfoItem.Create("Generator is Always Active")); | infoItems.Add(PartInfoItem.Create("Generator is Always Active")); |
} | } |
} | } |
} | } |
private void SetGimbalInfo() | private void SetGimbalInfo() |
{ | { |
moduleGimbal = selectedPart.GetModule<ModuleGimbal>(); | moduleGimbal = selectedPart.GetModule<ModuleGimbal>(); |
if (moduleGimbal != null) | if (moduleGimbal != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Thrust Vectoring", moduleGimbal.gimbalRange.ToString("F2"))); | infoItems.Add(PartInfoItem.Create("Thrust Vectoring", moduleGimbal.gimbalRange.ToString("F2"))); |
} | } |
} | } |
private void SetMassItems() | private void SetMassItems() |
{ | { |
if (selectedPart.physicalSignificance == Part.PhysicalSignificance.FULL) | if (selectedPart.physicalSignificance == Part.PhysicalSignificance.FULL) |
{ | { |
infoItems.Add(PartInfoItem.Create("Mass", Units.ToMass(selectedPart.GetDryMass(), selectedPart.GetWetMass()))); | infoItems.Add(PartInfoItem.Create("Mass", Units.ToMass(selectedPart.GetDryMass(), selectedPart.GetWetMass()))); |
} | } |
} | } |
private void SetParachuteInfo() | private void SetParachuteInfo() |
{ | { |
moduleParachute = selectedPart.GetModule<ModuleParachute>(); | moduleParachute = selectedPart.GetModule<ModuleParachute>(); |
if (moduleParachute != null) | if (moduleParachute != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Deployed Drag", Units.ConcatF(moduleParachute.semiDeployedDrag, moduleParachute.fullyDeployedDrag))); | infoItems.Add(PartInfoItem.Create("Deployed Drag", Units.ConcatF(moduleParachute.semiDeployedDrag, moduleParachute.fullyDeployedDrag))); |
infoItems.Add(PartInfoItem.Create("Deployment Altitude", moduleParachute.deployAltitude.ToDistance())); | infoItems.Add(PartInfoItem.Create("Deployment Altitude", moduleParachute.deployAltitude.ToDistance())); |
infoItems.Add(PartInfoItem.Create("Deployment Pressure", moduleParachute.minAirPressureToOpen.ToString("F2"))); | infoItems.Add(PartInfoItem.Create("Deployment Pressure", moduleParachute.minAirPressureToOpen.ToString("F2"))); |
} | } |
} | } |
private void SetRcsInfo() | private void SetRcsInfo() |
{ | { |
moduleRcs = selectedPart.GetModule<ModuleRCS>(); | moduleRcs = selectedPart.GetModule<ModuleRCS>(); |
if (moduleRcs != null) | if (moduleRcs != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Thruster Power", moduleRcs.thrusterPower.ToForce())); | infoItems.Add(PartInfoItem.Create("Thruster Power", moduleRcs.thrusterPower.ToForce())); |
infoItems.Add(PartInfoItem.Create("Specific Impulse", Units.ConcatF(moduleRcs.atmosphereCurve.Evaluate(1.0f), moduleRcs.atmosphereCurve.Evaluate(0.0f)) + "s")); | infoItems.Add(PartInfoItem.Create("Specific Impulse", Units.ConcatF(moduleRcs.atmosphereCurve.Evaluate(1.0f), moduleRcs.atmosphereCurve.Evaluate(0.0f)) + "s")); |
} | } |
} | } |
private void SetReactionWheelInfo() | private void SetReactionWheelInfo() |
{ | { |
moduleReactionWheel = selectedPart.GetModule<ModuleReactionWheel>(); | moduleReactionWheel = selectedPart.GetModule<ModuleReactionWheel>(); |
if (moduleReactionWheel != null) | if (moduleReactionWheel != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Reaction Wheel Torque")); | infoItems.Add(PartInfoItem.Create("Reaction Wheel Torque")); |
infoItems.Add(PartInfoItem.Create("\tPitch", moduleReactionWheel.PitchTorque.ToTorque())); | infoItems.Add(PartInfoItem.Create("\tPitch", moduleReactionWheel.PitchTorque.ToTorque())); |
infoItems.Add(PartInfoItem.Create("\tRoll", moduleReactionWheel.RollTorque.ToTorque())); | infoItems.Add(PartInfoItem.Create("\tRoll", moduleReactionWheel.RollTorque.ToTorque())); |
infoItems.Add(PartInfoItem.Create("\tYaw", moduleReactionWheel.YawTorque.ToTorque())); | infoItems.Add(PartInfoItem.Create("\tYaw", moduleReactionWheel.YawTorque.ToTorque())); |
for (int i = 0; i < moduleReactionWheel.inputResources.Count; ++i) | for (int i = 0; i < moduleReactionWheel.inputResources.Count; ++i) |
{ | { |
moduleResource = moduleReactionWheel.inputResources[i]; | moduleResource = moduleReactionWheel.inputResources[i]; |
infoItems.Add(PartInfoItem.Create("\t" + moduleResource.name, moduleResource.rate.ToRate())); | infoItems.Add(PartInfoItem.Create("\t" + moduleResource.name, moduleResource.rate.ToRate())); |
} | } |
} | } |
} | } |
private void SetResourceItems() | private void SetResourceItems() |
{ | { |
bool visibleResources = false; | bool visibleResources = false; |
for (int i = 0; i < selectedPart.Resources.list.Count; ++i) | for (int i = 0; i < selectedPart.Resources.list.Count; ++i) |
{ | { |
if (selectedPart.Resources.list[i].hideFlow == false) | if (selectedPart.Resources.list[i].hideFlow == false) |
{ | { |
visibleResources = true; | visibleResources = true; |
break; | break; |
} | } |
} | } |
if (visibleResources) | if (visibleResources) |
{ | { |
infoItems.Add(PartInfoItem.Create("Resources")); | infoItems.Add(PartInfoItem.Create("Resources")); |
for (int i = 0; i < selectedPart.Resources.list.Count; ++i) | for (int i = 0; i < selectedPart.Resources.list.Count; ++i) |
{ | { |
partResource = selectedPart.Resources.list[i]; | partResource = selectedPart.Resources.list[i]; |
if (partResource.hideFlow == false) | if (partResource.hideFlow == false) |
{ | { |
infoItems.Add(partResource.GetDensity() > 0 | infoItems.Add(partResource.GetDensity() > 0 |
? PartInfoItem.Create("\t" + partResource.info.name, "(" + partResource.GetMass().ToMass() + ") " + partResource.amount.ToString("F1")) | ? PartInfoItem.Create("\t" + partResource.info.name, "(" + partResource.GetMass().ToMass() + ") " + partResource.amount.ToString("F1")) |
: PartInfoItem.Create("\t" + partResource.info.name, partResource.amount.ToString("F1"))); | : PartInfoItem.Create("\t" + partResource.info.name, partResource.amount.ToString("F1"))); |
} | } |
} | } |
} | } |
} | } |
private void SetSasInfo() | private void SetSasInfo() |
{ | { |
if (selectedPart.HasModule<ModuleSAS>()) | if (selectedPart.HasModule<ModuleSAS>()) |
{ | { |
infoItems.Add(PartInfoItem.Create("SAS Equiped")); | infoItems.Add(PartInfoItem.Create("SAS Equiped")); |
} | } |
} | } |
private void SetScienceContainerInfo() | private void SetScienceContainerInfo() |
{ | { |
if (selectedPart.HasModule<ModuleScienceContainer>()) | if (selectedPart.HasModule<ModuleScienceContainer>()) |
{ | { |
infoItems.Add(PartInfoItem.Create("Science Container")); | infoItems.Add(PartInfoItem.Create("Science Container")); |
} | } |
} | } |
private void SetScienceExperimentInfo() | private void SetScienceExperimentInfo() |
{ | { |
moduleScienceExperiment = selectedPart.GetModule<ModuleScienceExperiment>(); | moduleScienceExperiment = selectedPart.GetModule<ModuleScienceExperiment>(); |
if (moduleScienceExperiment != null) | if (moduleScienceExperiment != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Science Experiment", moduleScienceExperiment.experimentActionName)); | infoItems.Add(PartInfoItem.Create("Science Experiment", moduleScienceExperiment.experimentActionName)); |
infoItems.Add(PartInfoItem.Create("\tTransmit Efficiency", moduleScienceExperiment.xmitDataScalar.ToPercent())); | infoItems.Add(PartInfoItem.Create("\tTransmit Efficiency", moduleScienceExperiment.xmitDataScalar.ToPercent())); |
if (moduleScienceExperiment.rerunnable == false) | if (moduleScienceExperiment.rerunnable == false) |
{ | { |
infoItems.Add(PartInfoItem.Create("\tSingle Usage")); | infoItems.Add(PartInfoItem.Create("\tSingle Usage")); |
} | } |
} | } |
} | } |
private void SetSingleActivationInfo() | private void SetSingleActivationInfo() |
{ | { |
if (selectedPart.HasModule<ModuleAnimateGeneric>(m => m.isOneShot)) | if (selectedPart.HasModule<ModuleAnimateGeneric>(m => m.isOneShot)) |
{ | { |
infoItems.Add(PartInfoItem.Create("Single Activation")); | infoItems.Add(PartInfoItem.Create("Single Activation")); |
} | } |
} | } |
private void SetSolarPanelInfo() | private void SetSolarPanelInfo() |
{ | { |
moduleDeployableSolarPanel = selectedPart.GetModule<ModuleDeployableSolarPanel>(); | moduleDeployableSolarPanel = selectedPart.GetModule<ModuleDeployableSolarPanel>(); |
if (moduleDeployableSolarPanel != null) | if (moduleDeployableSolarPanel != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Charge Rate", moduleDeployableSolarPanel.chargeRate.ToRate())); | infoItems.Add(PartInfoItem.Create("Charge Rate", moduleDeployableSolarPanel.chargeRate.ToRate())); |
if (moduleDeployableSolarPanel.isBreakable) | if (moduleDeployableSolarPanel.isBreakable) |
{ | { |
infoItems.Add(PartInfoItem.Create("Breakable")); | infoItems.Add(PartInfoItem.Create("Breakable")); |
} | } |
if (moduleDeployableSolarPanel.sunTracking) | if (moduleDeployableSolarPanel.sunTracking) |
{ | { |
infoItems.Add(PartInfoItem.Create("Sun Tracking")); | infoItems.Add(PartInfoItem.Create("Sun Tracking")); |
} | } |
} | } |
} | } |
private void SetTransmitterInfo() | private void SetTransmitterInfo() |
{ | { |
moduleDataTransmitter = selectedPart.GetModule<ModuleDataTransmitter>(); | moduleDataTransmitter = selectedPart.GetModule<ModuleDataTransmitter>(); |
if (moduleDataTransmitter != null) | if (moduleDataTransmitter != null) |
{ | { |
infoItems.Add(PartInfoItem.Create("Packet Size", moduleDataTransmitter.packetSize.ToString("F2") + " Mits")); | infoItems.Add(PartInfoItem.Create("Packet Size", moduleDataTransmitter.packetSize.ToString("F2") + " Mits")); |
infoItems.Add(PartInfoItem.Create("Bandwidth", (moduleDataTransmitter.packetInterval * moduleDataTransmitter.packetSize).ToString("F2") + "Mits/sec")); | infoItems.Add(PartInfoItem.Create("Bandwidth", (moduleDataTransmitter.packetInterval * moduleDataTransmitter.packetSize).ToString("F2") + "Mits/sec")); |
infoItems.Add(PartInfoItem.Create(moduleDataTransmitter.requiredResource, moduleDataTransmitter.packetResourceCost.ToString("F2") + "/Packet")); | infoItems.Add(PartInfoItem.Create(moduleDataTransmitter.requiredResource, moduleDataTransmitter.packetResourceCost.ToString("F2") + "/Packet")); |
} | } |
} | } |
private void Window(int windowId) | private void Window(int windowId) |
{ | { |
try | try |
{ | { |
GUILayout.Label(selectedPart.partInfo.title, BuildOverlay.TitleStyle); | GUILayout.Label(selectedPart.partInfo.title, BuildOverlay.TitleStyle); |
if (showInfo) | if (showInfo) |
{ | { |
for (int i = 0; i < infoItems.Count; ++i) | for (int i = 0; i < infoItems.Count; ++i) |
{ | { |
partInfoItem = infoItems[i]; | partInfoItem = infoItems[i]; |
GUILayout.Space(2.0f); | GUILayout.Space(2.0f); |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
if (partInfoItem.Value != null) | if (partInfoItem.Value != null) |
{ | { |
GUILayout.Label(partInfoItem.Name + ":", BuildOverlay.NameStyle); | GUILayout.Label(partInfoItem.Name + ":", BuildOverlay.NameStyle); |
GUILayout.Space(25.0f); | GUILayout.Space(25.0f); |
GUILayout.Label(partInfoItem.Value, BuildOverlay.ValueStyle); | GUILayout.Label(partInfoItem.Value, BuildOverlay.ValueStyle); |
} | } |
else | else |
{ | { |
GUILayout.Label(partInfoItem.Name, BuildOverlay.NameStyle); | GUILayout.Label(partInfoItem.Name, BuildOverlay.NameStyle); |
} | } |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
} | } |
} | } |
else if (clickToOpen && namesOnly == false) | else if (clickToOpen && namesOnly == false) |
{ | { |
GUILayout.Space(2.0f); | GUILayout.Space(2.0f); |
GUILayout.Label("Click middle mouse to show more info...", BuildOverlay.NameStyle); | GUILayout.Label("Click middle mouse to show more info...", BuildOverlay.NameStyle); |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
} | } |
} | } |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2014 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
#region Using Directives | |
using System; | |
using UnityEngine; | |
#endregion | |
namespace KerbalEngineer.Editor | |
{ | |
[KSPAddon(KSPAddon.Startup.EditorAny, false)] | |
public class BuildToolbar : MonoBehaviour | |
{ | |
#region Fields | |
private ApplicationLauncherButton button; | |
#endregion | |
#region Methods: private | |
private void Awake() | |
{ | |
GameEvents.onGUIApplicationLauncherReady.Add(this.OnGuiAppLauncherReady); | |
Logger.Log("BuildToolbar->Awake"); | |
} | |
private void Start() | |
{ | |
if (button == null) | |
{ | |
OnGuiAppLauncherReady(); | |
} | |
} | |
private void OnDestroy() | |
{ | |
GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady); | |
if (this.button != null) | |
{ | |
ApplicationLauncher.Instance.RemoveModApplication(this.button); | |
} | |
Logger.Log("BuildToolbar->OnDestroy"); | |
} | |
private void OnGuiAppLauncherReady() | |
{ | |
try | |
{ | |
this.button = ApplicationLauncher.Instance.AddModApplication( | |
() => BuildAdvanced.Instance.Visible = true, | |
() => BuildAdvanced.Instance.Visible = false, | |
null, | |
null, | |
null, | |
null, | |
ApplicationLauncher.AppScenes.ALWAYS, | |
GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/ToolbarIcon", false) | |
); | |
Logger.Log("BuildToolbar->OnGuiAppLauncherReady"); | |
} | |
catch (Exception ex) | |
{ | |
Logger.Exception(ex, "BuildToolbar->OnGuiAppLauncherReady"); | |
} | |
} | |
private void Update() | |
{ | |
try | |
{ | |
if (this.button == null) | |
{ | |
return; | |
} | |
if (EditorLogic.fetch != null && EditorLogic.fetch.ship.parts.Count > 0) | |
{ | |
if (BuildAdvanced.Instance.Visible && this.button.State != RUIToggleButton.ButtonState.TRUE) | |
{ | |
this.button.SetTrue(); | |
} | |
else if (!BuildAdvanced.Instance.Visible && this.button.State != RUIToggleButton.ButtonState.FALSE) | |
{ | |
this.button.SetFalse(); | |
} | |
} | |
else if (this.button.State != RUIToggleButton.ButtonState.DISABLED) | |
{ | |
this.button.Disable(); | |
} | |
} | |
catch (Exception ex) | |
{ | |
Logger.Exception(ex, "BuildToolbar->Update"); | |
} | |
} | |
#endregion | |
} | |
} |
// | // |
// Copyright (C) 2015 CYBUTEK | // Copyright (C) 2015 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer | namespace KerbalEngineer |
{ | { |
using System.IO; | using System.IO; |
using System.Reflection; | using System.Reflection; |
public static class EngineerGlobals | public static class EngineerGlobals |
{ | { |
/// <summary> | /// <summary> |
/// Current version of the Kerbal Engineer assembly. | /// Current version of the Kerbal Engineer assembly. |
/// </summary> | /// </summary> |
public const string ASSEMBLY_VERSION = "1.0.18.1"; | public const string ASSEMBLY_VERSION = "1.0.19.4"; |
private static string assemblyFile; | private static string assemblyFile; |
private static string assemblyName; | private static string assemblyName; |
private static string assemblyPath; | private static string assemblyPath; |
private static string settingsPath; | |
/// <summary> | /// <summary> |
/// Gets the Kerbal Engineer assembly's path including the file name. | /// Gets the Kerbal Engineer assembly's path including the file name. |
/// </summary> | /// </summary> |
public static string AssemblyFile | public static string AssemblyFile |
{ | { |
get | get |
{ | { |
return assemblyFile ?? (assemblyFile = Assembly.GetExecutingAssembly().Location); | return assemblyFile ?? (assemblyFile = Assembly.GetExecutingAssembly().Location); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets the Kerbal Engineer assembly's file name. | /// Gets the Kerbal Engineer assembly's file name. |
/// </summary> | /// </summary> |
public static string AssemblyName | public static string AssemblyName |
{ | { |
get | get |
{ | { |
return assemblyName ?? (assemblyName = new FileInfo(AssemblyFile).Name); | return assemblyName ?? (assemblyName = new FileInfo(AssemblyFile).Name); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets the Kerbal Engineer assembly's path excluding the file name. | /// Gets the Kerbal Engineer assembly's path excluding the file name. |
/// </summary> | /// </summary> |
public static string AssemblyPath | public static string AssemblyPath |
{ | { |
get | get |
{ | { |
return assemblyPath ?? (assemblyPath = AssemblyFile.Replace(new FileInfo(AssemblyFile).Name, "")); | return assemblyPath ?? (assemblyPath = AssemblyFile.Replace(new FileInfo(AssemblyFile).Name, "")); |
} | } |
} | } |
/// <summary> | |
/// Gets the settings directory path. | |
/// </summary> | |
public static string SettingsPath | |
{ | |
get | |
{ | |
if (string.IsNullOrEmpty(settingsPath)) | |
{ | |
settingsPath = Path.Combine(AssemblyPath, "Settings"); | |
} | |
return settingsPath; | |
} | |
} | |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | #region Using Directives |
using System; | using System; |
using KerbalEngineer.Helpers; | using KerbalEngineer.Helpers; |
using UnityEngine; | using UnityEngine; |
#endregion | #endregion |
namespace KerbalEngineer.Extensions | namespace KerbalEngineer.Extensions |
{ | { |
public static class OrbitExtensions | public static class OrbitExtensions |
{ | { |
#region Constants | #region Constants |
public const double Tau = Math.PI * 2.0; | public const double Tau = Math.PI * 2.0; |
#endregion | #endregion |
#region Methods: public | #region Methods: public |
public static double GetAngleToAscendingNode(this Orbit orbit) | public static double GetAngleToAscendingNode(this Orbit orbit) |
{ | { |
return GetAngleToTrueAnomaly(orbit, GetTrueAnomalyOfAscendingNode(orbit)); | return GetAngleToTrueAnomaly(orbit, GetTrueAnomalyOfAscendingNode(orbit)); |
} | } |
public static double GetAngleToDescendingNode(this Orbit orbit) | public static double GetAngleToDescendingNode(this Orbit orbit) |
{ | { |
return GetAngleToTrueAnomaly(orbit, GetTrueAnomalyOfDescendingNode(orbit)); | return GetAngleToTrueAnomaly(orbit, GetTrueAnomalyOfDescendingNode(orbit)); |
} | } |
public static double GetAngleToPrograde(this Orbit orbit) | public static double GetAngleToPrograde(this Orbit orbit) |
{ | { |
return GetAngleToPrograde(orbit, Planetarium.GetUniversalTime()); | return GetAngleToPrograde(orbit, Planetarium.GetUniversalTime()); |
} | } |
public static double GetAngleToPrograde(this Orbit orbit, double universalTime) | public static double GetAngleToPrograde(this Orbit orbit, double universalTime) |
{ | { |
if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody) | if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody) |
{ | { |
return 0.0; | return 0.0; |
} | } |
var angle = AngleHelper.GetAngleBetweenVectors(orbit.getRelativePositionAtUT(universalTime), | Vector3d orbitVector = orbit.getRelativePositionAtUT(universalTime); |
Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(universalTime))); | orbitVector.z = 0.0; |
angle = AngleHelper.Clamp360(angle - 90.0); | Vector3d bodyVector = orbit.referenceBody.orbit.getOrbitalVelocityAtUT(universalTime); |
bodyVector.z = 0.0; | |
return orbit.inclination > 90.0 ? angle : 360.0 - angle; | double angle = AngleHelper.GetAngleBetweenVectors(bodyVector, orbitVector); |
return AngleHelper.Clamp360(orbit.inclination < 90.0 ? angle : 360.0 - angle); | |
} | } |
public static double GetAngleToRetrograde(this Orbit orbit) | public static double GetAngleToRetrograde(this Orbit orbit) |
{ | { |
return GetAngleToRetrograde(orbit, Planetarium.GetUniversalTime()); | return GetAngleToRetrograde(orbit, Planetarium.GetUniversalTime()); |
} | } |
public static double GetAngleToRetrograde(this Orbit orbit, double universalTime) | public static double GetAngleToRetrograde(this Orbit orbit, double universalTime) |
{ | { |
if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody) | if (orbit.referenceBody == CelestialBodies.SystemBody.CelestialBody) |
{ | { |
return 0.0; | return 0.0; |
} | } |
var angle = AngleHelper.GetAngleBetweenVectors(orbit.getRelativePositionAtUT(universalTime), | Vector3d orbitVector = orbit.getRelativePositionAtUT(universalTime); |
Vector3d.Exclude(orbit.GetOrbitNormal(), orbit.referenceBody.orbit.getRelativePositionAtUT(universalTime))); | orbitVector.z = 0.0; |
angle = AngleHelper.Clamp360(angle + 90.0); | Vector3d bodyVector = orbit.referenceBody.orbit.getOrbitalVelocityAtUT(universalTime); |
bodyVector.z = 0.0; | |
return orbit.inclination > 90.0 ? angle : 360.0 - angle; | double angle = AngleHelper.GetAngleBetweenVectors(-bodyVector, orbitVector); |
return AngleHelper.Clamp360(orbit.inclination < 90.0 ? angle : 360.0 - angle); | |
} | } |
public static double GetAngleToTrueAnomaly(this Orbit orbit, double trueAnomaly) | public static double GetAngleToTrueAnomaly(this Orbit orbit, double trueAnomaly) |
{ | { |
return AngleHelper.Clamp360(trueAnomaly - orbit.trueAnomaly); | return AngleHelper.Clamp360(trueAnomaly - orbit.trueAnomaly); |
} | } |
public static double GetAngleToVector(this Orbit orbit, Vector3d vector) | public static double GetAngleToVector(this Orbit orbit, Vector3d vector) |
{ | { |
return GetAngleToTrueAnomaly(orbit, GetTrueAnomalyFromVector(orbit, Vector3d.Exclude(orbit.GetOrbitNormal(), vector))); | return GetAngleToTrueAnomaly(orbit, GetTrueAnomalyFromVector(orbit, Vector3d.Exclude(orbit.GetOrbitNormal(), vector))); |
} | } |
public static double GetPhaseAngle(this Orbit orbit, Orbit target) | public static double GetPhaseAngle(this Orbit orbit, Orbit target) |
{ | { |
var angle = AngleHelper.GetAngleBetweenVectors(Vector3d.Exclude(orbit.GetOrbitNormal(), target.pos), orbit.pos); | var angle = AngleHelper.GetAngleBetweenVectors(Vector3d.Exclude(orbit.GetOrbitNormal(), target.pos), orbit.pos); |
return (orbit.semiMajorAxis < target.semiMajorAxis) ? angle : angle - 360.0; | return (orbit.semiMajorAxis < target.semiMajorAxis) ? angle : angle - 360.0; |
} | } |
public static double GetRelativeInclination(this Orbit orbit, Orbit target) | public static double GetRelativeInclination(this Orbit orbit, Orbit target) |
{ | { |
return Vector3d.Angle(orbit.GetOrbitNormal(), target.GetOrbitNormal()); | return Vector3d.Angle(orbit.GetOrbitNormal(), target.GetOrbitNormal()); |
} | } |
public static double GetTimeToAscendingNode(this Orbit orbit) | public static double GetTimeToAscendingNode(this Orbit orbit) |
{ | { |
return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyOfAscendingNode(orbit)); | return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyOfAscendingNode(orbit)); |
} | } |
public static double GetTimeToDescendingNode(this Orbit orbit) | public static double GetTimeToDescendingNode(this Orbit orbit) |
{ | { |
return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyOfDescendingNode(orbit)); | return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyOfDescendingNode(orbit)); |
} | } |
public static double GetTimeToTrueAnomaly(this Orbit orbit, double trueAnomaly) | public static double GetTimeToTrueAnomaly(this Orbit orbit, double trueAnomaly) |
{ | { |
var time = orbit.GetDTforTrueAnomaly(trueAnomaly * Mathf.Deg2Rad, orbit.period); | var time = orbit.GetDTforTrueAnomaly(trueAnomaly * Mathf.Deg2Rad, orbit.period); |
return time < 0.0 ? time + orbit.period : time; | return time < 0.0 ? time + orbit.period : time; |
} | } |
public static double GetTimeToVector(this Orbit orbit, Vector3d vector) | public static double GetTimeToVector(this Orbit orbit, Vector3d vector) |
{ | { |
return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyFromVector(orbit, vector)); | return GetTimeToTrueAnomaly(orbit, GetTrueAnomalyFromVector(orbit, vector)); |
} | } |
public static double GetTrueAnomalyFromVector(this Orbit orbit, Vector3d vector) | public static double GetTrueAnomalyFromVector(this Orbit orbit, Vector3d vector) |
{ | { |
return orbit.GetTrueAnomalyOfZupVector(vector) * Mathf.Rad2Deg; | return orbit.GetTrueAnomalyOfZupVector(vector) * Mathf.Rad2Deg; |
} | } |
public static double GetTrueAnomalyOfAscendingNode(this Orbit orbit) | public static double GetTrueAnomalyOfAscendingNode(this Orbit orbit) |
{ | { |
return 360.0 - orbit.argumentOfPeriapsis; | return 360.0 - orbit.argumentOfPeriapsis; |
} | } |
public static double GetTrueAnomalyOfDescendingNode(this Orbit orbit) | public static double GetTrueAnomalyOfDescendingNode(this Orbit orbit) |
{ | { |
return 180.0 - orbit.argumentOfPeriapsis; | return 180.0 - orbit.argumentOfPeriapsis; |
} | } |
#endregion | #endregion |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | #region Using Directives |
using System; | using System; |
using UnityEngine; | using UnityEngine; |
#endregion | #endregion |
namespace KerbalEngineer.Flight | namespace KerbalEngineer.Flight |
{ | { |
using KSP.UI.Screens; | |
/// <summary> | /// <summary> |
/// Graphical controller for section interaction in the form of a menu system. | /// Graphical controller for section interaction in the form of a menu system. |
/// </summary> | /// </summary> |
[KSPAddon(KSPAddon.Startup.Flight, false)] | [KSPAddon(KSPAddon.Startup.Flight, false)] |
public class ActionMenu : MonoBehaviour | public class ActionMenu : MonoBehaviour |
{ | { |
#region Fields | #region Fields |
private ActionMenuGui actionMenuGui; | private ActionMenuGui actionMenuGui; |
private ApplicationLauncherButton button; | private ApplicationLauncherButton button; |
#endregion | #endregion |
#region Methods: protected | #region Methods: protected |
protected void Awake() | protected void Awake() |
{ | { |
try | try |
{ | { |
GameEvents.onGUIApplicationLauncherReady.Add(this.OnGuiAppLauncherReady); | GameEvents.onGUIApplicationLauncherReady.Add(this.OnGuiAppLauncherReady); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
Logger.Log("ActionMenu was created."); | Logger.Log("ActionMenu was created."); |
} | } |
protected void Start() | protected void Start() |
{ | { |
if (button == null) | if (button == null) |
{ | { |
OnGuiAppLauncherReady(); | OnGuiAppLauncherReady(); |
} | } |
} | } |
protected void OnDestroy() | protected void OnDestroy() |
{ | { |
try | try |
{ | { |
GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady); | GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady); |
GameEvents.onHideUI.Remove(this.OnHide); | GameEvents.onHideUI.Remove(this.OnHide); |
GameEvents.onShowUI.Remove(this.OnShow); | GameEvents.onShowUI.Remove(this.OnShow); |
if (button != null) | if (button != null) |
{ | { |
ApplicationLauncher.Instance.RemoveModApplication(this.button); | ApplicationLauncher.Instance.RemoveModApplication(this.button); |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
Logger.Log("ActionMenu was destroyed."); | Logger.Log("ActionMenu was destroyed."); |
} | } |
protected void Update() | protected void Update() |
{ | { |
try | try |
{ | { |
if (this.button == null) | if (this.button == null) |
{ | { |
return; | return; |
} | } |
if (FlightEngineerCore.IsDisplayable && this.button.State == RUIToggleButton.ButtonState.DISABLED) | if (FlightEngineerCore.IsDisplayable && this.button.toggleButton.Interactable == false) |
{ | { |
this.button.Enable(); | this.button.Enable(); |
} | } |
else if (!FlightEngineerCore.IsDisplayable && this.button.State != RUIToggleButton.ButtonState.DISABLED) | else if (!FlightEngineerCore.IsDisplayable && this.button.toggleButton.Interactable) |
{ | { |
this.button.Disable(); | this.button.Disable(); |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
#endregion | #endregion |
#region Methods: private | #region Methods: private |
private void OnFalse() | private void OnFalse() |
{ | { |
try | try |
{ | { |
this.actionMenuGui.enabled = false; | this.actionMenuGui.enabled = false; |
this.actionMenuGui.StayOpen = false; | this.actionMenuGui.StayOpen = false; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void OnGuiAppLauncherReady() | private void OnGuiAppLauncherReady() |
{ | { |
try | try |
{ | { |
this.button = ApplicationLauncher.Instance.AddModApplication( | this.button = ApplicationLauncher.Instance.AddModApplication( |
this.OnTrue, | this.OnTrue, |
this.OnFalse, | this.OnFalse, |
this.OnHover, | this.OnHover, |
this.OnHoverOut, | this.OnHoverOut, |
null, | null, |
null, | null, |
ApplicationLauncher.AppScenes.ALWAYS, | ApplicationLauncher.AppScenes.ALWAYS, |
GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/ToolbarIcon", false)); | GameDatabase.Instance.GetTexture("KerbalEngineer/Textures/ToolbarIcon", false)); |
this.actionMenuGui = this.button.gameObject.AddComponent<ActionMenuGui>(); | this.actionMenuGui = this.button.gameObject.AddComponent<ActionMenuGui>(); |
this.actionMenuGui.transform.parent = this.button.transform; | this.actionMenuGui.transform.parent = this.button.transform; |
ApplicationLauncher.Instance.EnableMutuallyExclusive(this.button); | ApplicationLauncher.Instance.EnableMutuallyExclusive(this.button); |
GameEvents.onHideUI.Add(this.OnHide); | GameEvents.onHideUI.Add(this.OnHide); |
GameEvents.onShowUI.Add(this.OnShow); | GameEvents.onShowUI.Add(this.OnShow); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void OnHide() | private void OnHide() |
{ | { |
try | try |
{ | { |
this.actionMenuGui.Hidden = true; | this.actionMenuGui.Hidden = true; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void OnHover() | private void OnHover() |
{ | { |
try | try |
{ | { |
this.actionMenuGui.enabled = true; | this.actionMenuGui.enabled = true; |
this.actionMenuGui.Hovering = true; | this.actionMenuGui.Hovering = true; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void OnHoverOut() | private void OnHoverOut() |
{ | { |
try | try |
{ | { |
this.actionMenuGui.Hovering = false; | this.actionMenuGui.Hovering = false; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void OnShow() | private void OnShow() |
{ | { |
try | try |
{ | { |
this.actionMenuGui.Hidden = false; | this.actionMenuGui.Hidden = false; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
private void OnTrue() | private void OnTrue() |
{ | { |
try | try |
{ | { |
this.actionMenuGui.enabled = true; | this.actionMenuGui.enabled = true; |
this.actionMenuGui.StayOpen = true; | this.actionMenuGui.StayOpen = true; |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
#endregion | #endregion |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | #region Using Directives |
using System; | using System; |
using System.Collections.Generic; | using System.Collections.Generic; |
using System.Linq; | using System.Linq; |
using KerbalEngineer.Extensions; | using KerbalEngineer.Extensions; |
using KerbalEngineer.Flight.Sections; | using KerbalEngineer.Flight.Sections; |
using KerbalEngineer.Settings; | using KerbalEngineer.Settings; |
using UnityEngine; | using UnityEngine; |
#endregion | #endregion |
namespace KerbalEngineer.Flight | namespace KerbalEngineer.Flight |
{ | { |
using KeyBinding; | |
using Upgradeables; | using Upgradeables; |
/// <summary> | /// <summary> |
/// Graphical controller for displaying stacked sections. | /// Graphical controller for displaying stacked sections. |
/// </summary> | /// </summary> |
[KSPAddon(KSPAddon.Startup.Flight, false)] | [KSPAddon(KSPAddon.Startup.Flight, false)] |
public class DisplayStack : MonoBehaviour | public class DisplayStack : MonoBehaviour |
{ | { |
#region Fields | #region Fields |
private GUIStyle buttonStyle; | private GUIStyle buttonStyle; |
private int numberOfStackSections; | private int numberOfStackSections; |
private bool resizeRequested; | private bool resizeRequested; |
private bool showControlBar = true; | private bool showControlBar = true; |
private GUIStyle titleStyle; | private GUIStyle titleStyle; |
private int windowId; | private int windowId; |
private Rect windowPosition; | private Rect windowPosition; |
private GUIStyle windowStyle; | private GUIStyle windowStyle; |
#endregion | #endregion |
#region Properties | #region Properties |
/// <summary> | /// <summary> |
/// Gets the current instance of the DisplayStack. | /// Gets the current instance of the DisplayStack. |
/// </summary> | /// </summary> |
public static DisplayStack Instance { get; private set; } | public static DisplayStack Instance { get; private set; } |
public bool Hidden { get; set; } | public bool Hidden { get; set; } |
/// <summary> | /// <summary> |
/// Gets and sets the visibility of the control bar. | /// Gets and sets the visibility of the control bar. |
/// </summary> | /// </summary> |
public bool ShowControlBar | public bool ShowControlBar |
{ | { |
get { return this.showControlBar; } | get { return this.showControlBar; } |
set { this.showControlBar = value; } | set { this.showControlBar = value; } |
} | } |
#endregion | #endregion |
#region Methods: public | #region Methods: public |
/// <summary> | /// <summary> |
/// Request that the display stack's size is reset in the next draw call. | /// Request that the display stack's size is reset in the next draw call. |
/// </summary> | /// </summary> |
public void RequestResize() | public void RequestResize() |
{ | { |
this.resizeRequested = true; | this.resizeRequested = true; |
} | } |
#endregion | #endregion |
#region Methods: protected | #region Methods: protected |
/// <summary> | /// <summary> |
/// Sets the instance to this object. | /// Sets the instance to this object. |
/// </summary> | /// </summary> |
protected void Awake() | protected void Awake() |
{ | { |
try | try |
{ | { |
if (Instance == null) | if (Instance == null) |
{ | { |
Instance = this; | Instance = this; |
GuiDisplaySize.OnSizeChanged += this.OnSizeChanged; | GuiDisplaySize.OnSizeChanged += this.OnSizeChanged; |
Logger.Log("ActionMenu->Awake"); | Logger.Log("ActionMenu->Awake"); |
} | } |
else | else |
{ | { |
Destroy(this); | Destroy(this); |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Runs when the object is destroyed. | /// Runs when the object is destroyed. |
/// </summary> | /// </summary> |
protected void OnDestroy() | protected void OnDestroy() |
{ | { |
try | try |
{ | { |
this.Save(); | this.Save(); |
RenderingManager.RemoveFromPostDrawQueue(0, this.Draw); | RenderingManager.RemoveFromPostDrawQueue(0, this.Draw); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
Logger.Log("ActionMenu->OnDestroy"); | Logger.Log("ActionMenu->OnDestroy"); |
} | } |
/// <summary> | /// <summary> |
/// Initialises the object's state on creation. | /// Initialises the object's state on creation. |
/// </summary> | /// </summary> |
protected void Start() | protected void Start() |
{ | { |
try | try |
{ | { |
this.windowId = this.GetHashCode(); | this.windowId = this.GetHashCode(); |
this.InitialiseStyles(); | this.InitialiseStyles(); |
this.Load(); | this.Load(); |
RenderingManager.AddToPostDrawQueue(0, this.Draw); | RenderingManager.AddToPostDrawQueue(0, this.Draw); |
Logger.Log("ActionMenu->Start"); | Logger.Log("ActionMenu->Start"); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
protected void Update() | protected void Update() |
{ | { |
try | try |
{ | { |
if (!FlightEngineerCore.IsDisplayable) | if (!FlightEngineerCore.IsDisplayable) |
{ | { |
return; | return; |
} | } |
if (Input.GetKeyDown(KeyBinder.FlightShowHide)) | if (Input.GetKeyDown(KeyBinder.FlightShowHide)) |
{ | { |
this.Hidden = !this.Hidden; | this.Hidden = !this.Hidden; |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
#endregion | #endregion |
#region Methods: private | #region Methods: private |
/// <summary> | /// <summary> |
/// Called to draw the display stack when the UI is enabled. | /// Called to draw the display stack when the UI is enabled. |
/// </summary> | /// </summary> |
private void Draw() | private void Draw() |
{ | { |
try | try |
{ | { |
if (!FlightEngineerCore.IsDisplayable) | if (!FlightEngineerCore.IsDisplayable) |
{ | { |
return; | return; |
} | } |
if (this.resizeRequested || this.numberOfStackSections != SectionLibrary.NumberOfStackSections) | if (this.resizeRequested || this.numberOfStackSections != SectionLibrary.NumberOfStackSections) |
{ | { |
this.numberOfStackSections = SectionLibrary.NumberOfStackSections; | this.numberOfStackSections = SectionLibrary.NumberOfStackSections; |
this.windowPosition.width = 0; | this.windowPosition.width = 0; |
this.windowPosition.height = 0; | this.windowPosition.height = 0; |
this.resizeRequested = false; | this.resizeRequested = false; |
} | } |
if (!this.Hidden && (SectionLibrary.NumberOfStackSections > 0 || this.ShowControlBar)) | if (!this.Hidden && (SectionLibrary.NumberOfStackSections > 0 || this.ShowControlBar)) |
{ | { |
var shouldCentre = this.windowPosition.min == Vector2.zero; | var shouldCentre = this.windowPosition.min == Vector2.zero; |
GUI.skin = null; | GUI.skin = null; |
this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty, this.windowStyle).ClampToScreen(); | this.windowPosition = GUILayout.Window(this.windowId, this.windowPosition, this.Window, string.Empty, this.windowStyle).ClampToScreen(); |
if (shouldCentre) | if (shouldCentre) |
{ | { |
this.windowPosition.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f); | this.windowPosition.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f); |
} | } |
} | } |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Draws the control bar. | /// Draws the control bar. |
/// </summary> | /// </summary> |
private void DrawControlBar() | private void DrawControlBar() |
{ | { |
GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.ASSEMBLY_VERSION, this.titleStyle); | GUILayout.Label("FLIGHT ENGINEER " + EngineerGlobals.ASSEMBLY_VERSION, this.titleStyle); |
this.DrawControlBarButtons(SectionLibrary.StockSections); | this.DrawControlBarButtons(SectionLibrary.StockSections); |
this.DrawControlBarButtons(SectionLibrary.CustomSections); | this.DrawControlBarButtons(SectionLibrary.CustomSections); |
} | } |
/// <summary> | /// <summary> |
/// Draws a button list for a set of sections. | /// Draws a button list for a set of sections. |
/// </summary> | /// </summary> |
private void DrawControlBarButtons(IEnumerable<SectionModule> sections) | private void DrawControlBarButtons(IEnumerable<SectionModule> sections) |
{ | { |
var index = 0; | var index = 0; |
foreach (var section in sections.Where(s => !string.IsNullOrEmpty(s.Abbreviation) || !s.IsCustom)) | foreach (var section in sections.Where(s => !string.IsNullOrEmpty(s.Abbreviation) || !s.IsCustom)) |
{ | { |
if (index % 4 == 0) | if (index % 4 == 0) |
{ | { |
if (index > 0) | if (index > 0) |
{ | { |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
} | } |
GUILayout.BeginHorizontal(); | GUILayout.BeginHorizontal(); |
} | } |
section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle); | section.IsVisible = GUILayout.Toggle(section.IsVisible, section.Abbreviation.ToUpper(), this.buttonStyle); |
index++; | index++; |
} | } |
if (index > 0) | if (index > 0) |
{ | { |
GUILayout.EndHorizontal(); | GUILayout.EndHorizontal(); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Draws a list of sections. | /// Draws a list of sections. |
/// </summary> | /// </summary> |
private void DrawSections(IEnumerable<SectionModule> sections) | private void DrawSections(IEnumerable<SectionModule> sections) |
{ | { |
foreach (var section in sections) | foreach (var section in sections) |
{ | { |
if (!section.IsFloating) | if (!section.IsFloating) |
{ | { |
section.Draw(); | section.Draw(); |
} | } |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Initialises all the styles required for this object. | /// Initialises all the styles required for this object. |
/// </summary> | /// </summary> |
private void InitialiseStyles() | private void InitialiseStyles() |
{ | { |
this.windowStyle = new GUIStyle(HighLogic.Skin.window) | this.windowStyle = new GUIStyle(HighLogic.Skin.window) |
{ | { |
margin = new RectOffset(), | margin = new RectOffset(), |
padding = new RectOffset(5, 5, 0, 5) | padding = new RectOffset(5, 5, 0, 5) |
}; | }; |
this.titleStyle = new GUIStyle(HighLogic.Skin.label) | this.titleStyle = new GUIStyle(HighLogic.Skin.label) |
{ | { |
margin = new RectOffset(0, 0, 5, 3), | margin = new RectOffset(0, 0, 5, 3), |
padding = new RectOffset(), | padding = new RectOffset(), |
alignment = TextAnchor.MiddleCenter, | alignment = TextAnchor.MiddleCenter, |
fontSize = (int)(13 * GuiDisplaySize.Offset), | fontSize = (int)(13 * GuiDisplaySize.Offset), |
fontStyle = FontStyle.Bold, | fontStyle = FontStyle.Bold, |
stretchWidth = true | stretchWidth = true |
}; | }; |
this.buttonStyle = new GUIStyle(HighLogic.Skin.button) | this.buttonStyle = new GUIStyle(HighLogic.Skin.button) |
{ | { |
normal = | normal = |
{ | { |
textColor = Color.white | textColor = Color.white |
}, | }, |
margin = new RectOffset(), | margin = new RectOffset(), |
padding = new RectOffset(), | padding = new RectOffset(), |
alignment = TextAnchor.MiddleCenter, | alignment = TextAnchor.MiddleCenter, |
fontSize = (int)(11 * GuiDisplaySize.Offset), | fontSize = (int)(11 * GuiDisplaySize.Offset), |
fontStyle = FontStyle.Bold, | fontStyle = FontStyle.Bold, |
fixedWidth = 60.0f * GuiDisplaySize.Offset, | fixedWidth = 60.0f * GuiDisplaySize.Offset, |
fixedHeight = 25.0f * GuiDisplaySize.Offset, | fixedHeight = 25.0f * GuiDisplaySize.Offset, |
}; | }; |
} | } |
/// <summary> | /// <summary> |
/// Load the stack's state. | /// Load the stack's state. |
/// </summary> | /// </summary> |
private void Load() | private void Load() |
{ | { |
try | try |
{ | { |
var handler = SettingHandler.Load("DisplayStack.xml"); | var handler = SettingHandler.Load("DisplayStack.xml"); |
this.Hidden = handler.Get("hidden", this.Hidden); | this.Hidden = handler.Get("hidden", this.Hidden); |
this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar); | this.ShowControlBar = handler.Get("showControlBar", this.ShowControlBar); |
this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x); | this.windowPosition.x = handler.Get("windowPositionX", this.windowPosition.x); |
this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y); | this.windowPosition.y = handler.Get("windowPositionY", this.windowPosition.y); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "DisplayStack->Load"); | Logger.Exception(ex, "DisplayStack->Load"); |
} | } |
} | } |
private void OnSizeChanged() | private void OnSizeChanged() |
{ | { |
this.InitialiseStyles(); | this.InitialiseStyles(); |
this.RequestResize(); | this.RequestResize(); |
} | } |
/// <summary> | /// <summary> |
/// Saves the stack's state. | /// Saves the stack's state. |
/// </summary> | /// </summary> |
private void Save() | private void Save() |
{ | { |
try | try |
{ | { |
var handler = new SettingHandler(); | var handler = new SettingHandler(); |
handler.Set("hidden", this.Hidden); | handler.Set("hidden", this.Hidden); |
handler.Set("showControlBar", this.ShowControlBar); | handler.Set("showControlBar", this.ShowControlBar); |
handler.Set("windowPositionX", this.windowPosition.x); | handler.Set("windowPositionX", this.windowPosition.x); |
handler.Set("windowPositionY", this.windowPosition.y); | handler.Set("windowPositionY", this.windowPosition.y); |
handler.Save("DisplayStack.xml"); | handler.Save("DisplayStack.xml"); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "DisplayStack->Save"); | Logger.Exception(ex, "DisplayStack->Save"); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Draws the display stack window. | /// Draws the display stack window. |
/// </summary> | /// </summary> |
private void Window(int windowId) | private void Window(int windowId) |
{ | { |
try | try |
{ | { |
if (this.ShowControlBar) | if (this.ShowControlBar) |
{ | { |
this.DrawControlBar(); | this.DrawControlBar(); |
} | } |
if (SectionLibrary.NumberOfStackSections > 0) | if (SectionLibrary.NumberOfStackSections > 0) |
{ | { |
this.DrawSections(SectionLibrary.StockSections); | this.DrawSections(SectionLibrary.StockSections); |
this.DrawSections(SectionLibrary.CustomSections); | this.DrawSections(SectionLibrary.CustomSections); |
} | } |
GUI.DragWindow(); | GUI.DragWindow(); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex, "DisplayStack->Widnow"); | Logger.Exception(ex, "DisplayStack->Widnow"); |
} | } |
} | } |
#endregion | #endregion |
} | } |
} | } |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2014 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
#region Using Directives | |
using System; | |
using KerbalEngineer.Flight.Sections; | |
using KerbalEngineer.Helpers; | |
using UnityEngine; | |
#endregion | |
namespace KerbalEngineer.Flight.Readouts.Miscellaneous | |
{ | |
public class TimeReference : ReadoutModule | |
{ | |
#region Constructors | |
public TimeReference() | |
{ | |
this.Name = "Time Reference Adjuster"; | |
this.Category = ReadoutCategory.GetCategory("Miscellaneous"); | |
this.HelpString = "Shows a control that will allow you to select if days and years are calculated in Kerbin Time (6 hours/day) or Earth Time (24 hours/day)"; | |
this.IsDefault = false; | |
} | |
#endregion | |
#region Methods: public | |
public override void Draw(SectionModule section) | |
{ | |
GUILayout.BeginHorizontal(); | |
GUILayout.Label("Time Ref.: " + TimeFormatter.Reference, this.NameStyle); | |
if (GUILayout.Button("Earth", this.ButtonStyle)) | |
{ | |
TimeFormatter.SetReference(); | |
} | |
if (GUILayout.Button("Kerbin", this.ButtonStyle)) | |
{ | |
TimeFormatter.SetReference(PSystemManager.Instance.localBodies.Find(body => body.bodyName.Equals("Kerbin"))); | |
} | |
GUILayout.EndHorizontal(); | |
} | |
#endregion | |
} | |
} |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2015 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | |
using System; | |
using KerbalEngineer.Extensions; | |
using KerbalEngineer.Flight.Sections; | |
#endregion | |
namespace KerbalEngineer.Flight.Readouts.Orbital | namespace KerbalEngineer.Flight.Readouts.Orbital |
{ | { |
using Extensions; | |
using Helpers; | |
using Sections; | |
public class EccentricAnomaly : ReadoutModule | public class EccentricAnomaly : ReadoutModule |
{ | { |
#region Constructors | |
public EccentricAnomaly() | public EccentricAnomaly() |
{ | { |
this.Name = "Eccentric Anomaly"; | Name = "Eccentric Anomaly"; |
this.Category = ReadoutCategory.GetCategory("Orbital"); | Category = ReadoutCategory.GetCategory("Orbital"); |
this.HelpString = String.Empty; | HelpString = string.Empty; |
this.IsDefault = false; | IsDefault = false; |
} | } |
#endregion | |
#region Methods: public | |
public override void Draw(SectionModule section) | public override void Draw(SectionModule section) |
{ | { |
this.DrawLine(FlightGlobals.ship_orbit.eccentricAnomaly.ToAngle(), section.IsHud); | DrawLine((FlightGlobals.ship_orbit.eccentricAnomaly * Units.RAD_TO_DEG).ToAngle(), section.IsHud); |
} | } |
#endregion | |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2015 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | |
using System; | |
using KerbalEngineer.Extensions; | |
using KerbalEngineer.Flight.Sections; | |
#endregion | |
namespace KerbalEngineer.Flight.Readouts.Orbital | namespace KerbalEngineer.Flight.Readouts.Orbital |
{ | { |
using Extensions; | |
using Helpers; | |
using Sections; | |
public class MeanAnomaly : ReadoutModule | public class MeanAnomaly : ReadoutModule |
{ | { |
#region Constructors | |
public MeanAnomaly() | public MeanAnomaly() |
{ | { |
this.Name = "Mean Anomaly"; | Name = "Mean Anomaly"; |
this.Category = ReadoutCategory.GetCategory("Orbital"); | Category = ReadoutCategory.GetCategory("Orbital"); |
this.HelpString = String.Empty; | HelpString = string.Empty; |
this.IsDefault = false; | IsDefault = false; |
} | } |
#endregion | |
#region Methods: public | |
public override void Draw(SectionModule section) | public override void Draw(SectionModule section) |
{ | { |
this.DrawLine(FlightGlobals.ship_orbit.meanAnomaly.ToAngle(), section.IsHud); | DrawLine((FlightGlobals.ship_orbit.meanAnomaly * Units.RAD_TO_DEG).ToAngle(), section.IsHud); |
} | } |
#endregion | |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2015 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | |
using System; | |
using KerbalEngineer.Extensions; | |
using KerbalEngineer.Flight.Sections; | |
#endregion | |
namespace KerbalEngineer.Flight.Readouts.Orbital | namespace KerbalEngineer.Flight.Readouts.Orbital |
{ | { |
using Extensions; | |
using Helpers; | |
using Sections; | |
public class MeanAnomalyAtEpoc : ReadoutModule | public class MeanAnomalyAtEpoc : ReadoutModule |
{ | { |
#region Constructors | |
public MeanAnomalyAtEpoc() | public MeanAnomalyAtEpoc() |
{ | { |
this.Name = "Mean Anomaly at Epoc"; | Name = "Mean Anomaly at Epoc"; |
this.Category = ReadoutCategory.GetCategory("Orbital"); | Category = ReadoutCategory.GetCategory("Orbital"); |
this.HelpString = String.Empty; | HelpString = string.Empty; |
this.IsDefault = false; | IsDefault = false; |
} | } |
#endregion | |
#region Methods: public | |
public override void Draw(SectionModule section) | public override void Draw(SectionModule section) |
{ | { |
this.DrawLine(FlightGlobals.ship_orbit.meanAnomalyAtEpoch.ToAngle(), section.IsHud); | DrawLine((FlightGlobals.ship_orbit.meanAnomalyAtEpoch * Units.RAD_TO_DEG).ToAngle(), section.IsHud); |
} | } |
#endregion | |
} | } |
} | } |
// | // |
// Copyright (C) 2015 CYBUTEK | // Copyright (C) 2015 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer.Flight.Readouts | namespace KerbalEngineer.Flight.Readouts |
{ | { |
using System; | using System; |
using System.Collections.Generic; | using System.Collections.Generic; |
using System.Linq; | using System.Linq; |
using Miscellaneous; | using Miscellaneous; |
using Orbital; | using Orbital; |
using Orbital.ManoeuvreNode; | using Orbital.ManoeuvreNode; |
using Rendezvous; | using Rendezvous; |
using Settings; | using Settings; |
using Surface; | using Surface; |
using Thermal; | using Thermal; |
using Vessel; | using Vessel; |
using AltitudeSeaLevel = Surface.AltitudeSeaLevel; | using AltitudeSeaLevel = Surface.AltitudeSeaLevel; |
using ApoapsisHeight = Orbital.ApoapsisHeight; | using ApoapsisHeight = Orbital.ApoapsisHeight; |
using OrbitalPeriod = Orbital.OrbitalPeriod; | using OrbitalPeriod = Orbital.OrbitalPeriod; |
using PeriapsisHeight = Orbital.PeriapsisHeight; | using PeriapsisHeight = Orbital.PeriapsisHeight; |
using SemiMajorAxis = Orbital.SemiMajorAxis; | using SemiMajorAxis = Orbital.SemiMajorAxis; |
using SemiMinorAxis = Orbital.SemiMinorAxis; | using SemiMinorAxis = Orbital.SemiMinorAxis; |
using TimeToApoapsis = Orbital.TimeToApoapsis; | using TimeToApoapsis = Orbital.TimeToApoapsis; |
using TimeToPeriapsis = Orbital.TimeToPeriapsis; | using TimeToPeriapsis = Orbital.TimeToPeriapsis; |
public static class ReadoutLibrary | public static class ReadoutLibrary |
{ | { |
private static List<ReadoutModule> readouts = new List<ReadoutModule>(); | private static List<ReadoutModule> readouts = new List<ReadoutModule>(); |
/// <summary> | /// <summary> |
/// Sets up and populates the readout library with the stock readouts. | /// Sets up and populates the readout library with the stock readouts. |
/// </summary> | /// </summary> |
static ReadoutLibrary() | static ReadoutLibrary() |
{ | { |
try | try |
{ | { |
ReadoutCategory.SetCategory("Orbital", "Readout for orbital manovoeures."); | ReadoutCategory.SetCategory("Orbital", "Readout for orbital manovoeures."); |
ReadoutCategory.SetCategory("Surface", "Surface and atmospheric readouts."); | ReadoutCategory.SetCategory("Surface", "Surface and atmospheric readouts."); |
ReadoutCategory.SetCategory("Vessel", "Vessel performance statistics."); | ReadoutCategory.SetCategory("Vessel", "Vessel performance statistics."); |
ReadoutCategory.SetCategory("Rendezvous", "Readouts for rendezvous manovoeures."); | ReadoutCategory.SetCategory("Rendezvous", "Readouts for rendezvous manovoeures."); |
ReadoutCategory.SetCategory("Thermal", "Thermal characteristics readouts."); | ReadoutCategory.SetCategory("Thermal", "Thermal characteristics readouts."); |
ReadoutCategory.SetCategory("Miscellaneous", "Miscellaneous readouts."); | ReadoutCategory.SetCategory("Miscellaneous", "Miscellaneous readouts."); |
ReadoutCategory.Selected = ReadoutCategory.GetCategory("Orbital"); | ReadoutCategory.Selected = ReadoutCategory.GetCategory("Orbital"); |
// Orbital | // Orbital |
readouts.Add(new ApoapsisHeight()); | readouts.Add(new ApoapsisHeight()); |
readouts.Add(new PeriapsisHeight()); | readouts.Add(new PeriapsisHeight()); |
readouts.Add(new TimeToApoapsis()); | readouts.Add(new TimeToApoapsis()); |
readouts.Add(new TimeToPeriapsis()); | readouts.Add(new TimeToPeriapsis()); |
readouts.Add(new Inclination()); | readouts.Add(new Inclination()); |
readouts.Add(new TimeToEquatorialAscendingNode()); | readouts.Add(new TimeToEquatorialAscendingNode()); |
readouts.Add(new TimeToEquatorialDescendingNode()); | readouts.Add(new TimeToEquatorialDescendingNode()); |
readouts.Add(new AngleToEquatorialAscendingNode()); | readouts.Add(new AngleToEquatorialAscendingNode()); |
readouts.Add(new AngleToEquatorialDescendingNode()); | readouts.Add(new AngleToEquatorialDescendingNode()); |
readouts.Add(new Eccentricity()); | readouts.Add(new Eccentricity()); |
readouts.Add(new OrbitalSpeed()); | readouts.Add(new OrbitalSpeed()); |
readouts.Add(new OrbitalPeriod()); | readouts.Add(new OrbitalPeriod()); |
readouts.Add(new CurrentSoi()); | readouts.Add(new CurrentSoi()); |
readouts.Add(new LongitudeOfAscendingNode()); | readouts.Add(new LongitudeOfAscendingNode()); |
readouts.Add(new LongitudeOfPeriapsis()); | readouts.Add(new LongitudeOfPeriapsis()); |
readouts.Add(new ArgumentOfPeriapsis()); | readouts.Add(new ArgumentOfPeriapsis()); |
readouts.Add(new TrueAnomaly()); | readouts.Add(new TrueAnomaly()); |
readouts.Add(new MeanAnomaly()); | readouts.Add(new MeanAnomaly()); |
readouts.Add(new MeanAnomalyAtEpoc()); | readouts.Add(new MeanAnomalyAtEpoc()); |
readouts.Add(new EccentricAnomaly()); | readouts.Add(new EccentricAnomaly()); |
readouts.Add(new SemiMajorAxis()); | readouts.Add(new SemiMajorAxis()); |
readouts.Add(new SemiMinorAxis()); | readouts.Add(new SemiMinorAxis()); |
readouts.Add(new AngleToPrograde()); | readouts.Add(new AngleToPrograde()); |
readouts.Add(new AngleToRetrograde()); | readouts.Add(new AngleToRetrograde()); |
readouts.Add(new NodeProgradeDeltaV()); | readouts.Add(new NodeProgradeDeltaV()); |
readouts.Add(new NodeNormalDeltaV()); | readouts.Add(new NodeNormalDeltaV()); |
readouts.Add(new NodeRadialDeltaV()); | readouts.Add(new NodeRadialDeltaV()); |
readouts.Add(new NodeTotalDeltaV()); | readouts.Add(new NodeTotalDeltaV()); |
readouts.Add(new NodeBurnTime()); | readouts.Add(new NodeBurnTime()); |
readouts.Add(new NodeHalfBurnTime()); | readouts.Add(new NodeHalfBurnTime()); |
readouts.Add(new NodeTimeToManoeuvre()); | readouts.Add(new NodeTimeToManoeuvre()); |
readouts.Add(new NodeTimeToHalfBurn()); | readouts.Add(new NodeTimeToHalfBurn()); |
readouts.Add(new NodeAngleToPrograde()); | readouts.Add(new NodeAngleToPrograde()); |
readouts.Add(new NodeAngleToRetrograde()); | readouts.Add(new NodeAngleToRetrograde()); |
readouts.Add(new PostBurnApoapsis()); | readouts.Add(new PostBurnApoapsis()); |
readouts.Add(new PostBurnPeriapsis()); | readouts.Add(new PostBurnPeriapsis()); |
readouts.Add(new SpeedAtApoapsis()); | readouts.Add(new SpeedAtApoapsis()); |
readouts.Add(new SpeedAtPeriapsis()); | readouts.Add(new SpeedAtPeriapsis()); |
readouts.Add(new TimeToAtmosphere()); | readouts.Add(new TimeToAtmosphere()); |
// Surface | // Surface |
readouts.Add(new AltitudeSeaLevel()); | readouts.Add(new AltitudeSeaLevel()); |
readouts.Add(new AltitudeTerrain()); | readouts.Add(new AltitudeTerrain()); |
readouts.Add(new VerticalSpeed()); | readouts.Add(new VerticalSpeed()); |
readouts.Add(new VerticalAcceleration()); | readouts.Add(new VerticalAcceleration()); |
readouts.Add(new HorizontalSpeed()); | readouts.Add(new HorizontalSpeed()); |
readouts.Add(new HorizontalAcceleration()); | readouts.Add(new HorizontalAcceleration()); |
readouts.Add(new MachNumber()); | readouts.Add(new MachNumber()); |
readouts.Add(new Latitude()); | readouts.Add(new Latitude()); |
readouts.Add(new Longitude()); | readouts.Add(new Longitude()); |
readouts.Add(new GeeForce()); | readouts.Add(new GeeForce()); |
readouts.Add(new TerminalVelocity()); | readouts.Add(new TerminalVelocity()); |
readouts.Add(new AtmosphericEfficiency()); | readouts.Add(new AtmosphericEfficiency()); |
readouts.Add(new Biome()); | readouts.Add(new Biome()); |
readouts.Add(new Situation()); | readouts.Add(new Situation()); |
readouts.Add(new Slope()); | readouts.Add(new Slope()); |
readouts.Add(new ImpactTime()); | readouts.Add(new ImpactTime()); |
readouts.Add(new ImpactLongitude()); | readouts.Add(new ImpactLongitude()); |
readouts.Add(new ImpactLatitude()); | readouts.Add(new ImpactLatitude()); |
readouts.Add(new ImpactAltitude()); | readouts.Add(new ImpactAltitude()); |
readouts.Add(new ImpactBiome()); | readouts.Add(new ImpactBiome()); |
// Vessel | // Vessel |
readouts.Add(new Name()); | readouts.Add(new Name()); |
readouts.Add(new DeltaVStaged()); | readouts.Add(new DeltaVStaged()); |
readouts.Add(new DeltaVCurrent()); | readouts.Add(new DeltaVCurrent()); |
readouts.Add(new DeltaVTotal()); | readouts.Add(new DeltaVTotal()); |
readouts.Add(new DeltaVCurrentTotal()); | readouts.Add(new DeltaVCurrentTotal()); |
readouts.Add(new SpecificImpulse()); | readouts.Add(new SpecificImpulse()); |
readouts.Add(new Mass()); | readouts.Add(new Mass()); |
readouts.Add(new Thrust()); | readouts.Add(new Thrust()); |
readouts.Add(new ThrustToWeight()); | readouts.Add(new ThrustToWeight()); |
readouts.Add(new ThrustOffsetAngle()); | readouts.Add(new ThrustOffsetAngle()); |
readouts.Add(new ThrustTorque()); | readouts.Add(new ThrustTorque()); |
readouts.Add(new SurfaceThrustToWeight()); | readouts.Add(new SurfaceThrustToWeight()); |
readouts.Add(new Acceleration()); | readouts.Add(new Acceleration()); |
readouts.Add(new SuicideBurnAltitude()); | readouts.Add(new SuicideBurnAltitude()); |
readouts.Add(new SuicideBurnDistance()); | readouts.Add(new SuicideBurnDistance()); |
readouts.Add(new SuicideBurnDeltaV()); | readouts.Add(new SuicideBurnDeltaV()); |
readouts.Add(new IntakeAirUsage()); | readouts.Add(new IntakeAirUsage()); |
readouts.Add(new IntakeAirDemand()); | readouts.Add(new IntakeAirDemand()); |
readouts.Add(new IntakeAirSupply()); | readouts.Add(new IntakeAirSupply()); |
readouts.Add(new IntakeAirDemandSupply()); | readouts.Add(new IntakeAirDemandSupply()); |
readouts.Add(new PartCount()); | readouts.Add(new PartCount()); |
readouts.Add(new Heading()); | readouts.Add(new Heading()); |
readouts.Add(new Pitch()); | readouts.Add(new Pitch()); |
readouts.Add(new Roll()); | readouts.Add(new Roll()); |
readouts.Add(new HeadingRate()); | readouts.Add(new HeadingRate()); |
readouts.Add(new PitchRate()); | readouts.Add(new PitchRate()); |
readouts.Add(new RollRate()); | readouts.Add(new RollRate()); |
// Rendezvous | // Rendezvous |
readouts.Add(new TargetSelector()); | readouts.Add(new TargetSelector()); |
readouts.Add(new PhaseAngle()); | readouts.Add(new PhaseAngle()); |
readouts.Add(new InterceptAngle()); | readouts.Add(new InterceptAngle()); |
readouts.Add(new RelativeVelocity()); | readouts.Add(new RelativeVelocity()); |
readouts.Add(new RelativeSpeed()); | readouts.Add(new RelativeSpeed()); |
readouts.Add(new RelativeInclination()); | readouts.Add(new RelativeInclination()); |
readouts.Add(new TimeToRelativeAscendingNode()); | readouts.Add(new TimeToRelativeAscendingNode()); |
readouts.Add(new TimeToRelativeDescendingNode()); | readouts.Add(new TimeToRelativeDescendingNode()); |
readouts.Add(new AngleToRelativeAscendingNode()); | readouts.Add(new AngleToRelativeAscendingNode()); |
readouts.Add(new AngleToRelativeDescendingNode()); | readouts.Add(new AngleToRelativeDescendingNode()); |
readouts.Add(new Rendezvous.AltitudeSeaLevel()); | readouts.Add(new Rendezvous.AltitudeSeaLevel()); |
readouts.Add(new Rendezvous.ApoapsisHeight()); | readouts.Add(new Rendezvous.ApoapsisHeight()); |
readouts.Add(new Rendezvous.PeriapsisHeight()); | readouts.Add(new Rendezvous.PeriapsisHeight()); |
readouts.Add(new Rendezvous.TimeToApoapsis()); | readouts.Add(new Rendezvous.TimeToApoapsis()); |
readouts.Add(new Rendezvous.TimeToPeriapsis()); | readouts.Add(new Rendezvous.TimeToPeriapsis()); |
readouts.Add(new Distance()); | readouts.Add(new Distance()); |
readouts.Add(new Rendezvous.OrbitalPeriod()); | readouts.Add(new Rendezvous.OrbitalPeriod()); |
readouts.Add(new Rendezvous.SemiMajorAxis()); | readouts.Add(new Rendezvous.SemiMajorAxis()); |
readouts.Add(new Rendezvous.SemiMinorAxis()); | readouts.Add(new Rendezvous.SemiMinorAxis()); |
readouts.Add(new Rendezvous.RelativeRadialVelocity()); | readouts.Add(new Rendezvous.RelativeRadialVelocity()); |
readouts.Add(new Rendezvous.TimeToRendezvous()); | readouts.Add(new Rendezvous.TimeToRendezvous()); |
// Thermal | // Thermal |
readouts.Add(new InternalFlux()); | readouts.Add(new InternalFlux()); |
readouts.Add(new ConvectionFlux()); | readouts.Add(new ConvectionFlux()); |
readouts.Add(new RadiationFlux()); | readouts.Add(new RadiationFlux()); |
readouts.Add(new CriticalPart()); | readouts.Add(new CriticalPart()); |
readouts.Add(new CriticalTemperature()); | readouts.Add(new CriticalTemperature()); |
readouts.Add(new CriticalSkinTemperature()); | readouts.Add(new CriticalSkinTemperature()); |
readouts.Add(new CriticalThermalPercentage()); | readouts.Add(new CriticalThermalPercentage()); |
readouts.Add(new HottestPart()); | readouts.Add(new HottestPart()); |
readouts.Add(new HottestTemperature()); | readouts.Add(new HottestTemperature()); |
readouts.Add(new HottestSkinTemperature()); | readouts.Add(new HottestSkinTemperature()); |
readouts.Add(new CoolestPart()); | readouts.Add(new CoolestPart()); |
readouts.Add(new CoolestTemperature()); | readouts.Add(new CoolestTemperature()); |
readouts.Add(new CoolestSkinTemperature()); | readouts.Add(new CoolestSkinTemperature()); |
// Misc | // Misc |
readouts.Add(new Separator()); | readouts.Add(new Separator()); |
readouts.Add(new GuiSizeAdjustor()); | readouts.Add(new GuiSizeAdjustor()); |
readouts.Add(new SimulationDelay()); | readouts.Add(new SimulationDelay()); |
readouts.Add(new TimeReference()); | |
readouts.Add(new VectoredThrustToggle()); | readouts.Add(new VectoredThrustToggle()); |
readouts.Add(new SystemTime()); | readouts.Add(new SystemTime()); |
LoadHelpStrings(); | LoadHelpStrings(); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets and sets the available readout modules. | /// Gets and sets the available readout modules. |
/// </summary> | /// </summary> |
public static List<ReadoutModule> Readouts | public static List<ReadoutModule> Readouts |
{ | { |
get | get |
{ | { |
return readouts; | return readouts; |
} | } |
set | set |
{ | { |
readouts = value; | readouts = value; |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Gets a list of readout modules which are associated with the specified category. | /// Gets a list of readout modules which are associated with the specified category. |
/// </summary> | /// </summary> |
public static List<ReadoutModule> GetCategory(ReadoutCategory category) | public static List<ReadoutModule> GetCategory(ReadoutCategory category) |
{ | { |
return readouts.Where(r => r.Category == category).ToList(); | return readouts.Where(r => r.Category == category).ToList(); |
} | } |
/// <summary> | /// <summary> |
/// Gets a readout module with the specified name or class name. (Returns null if not found.) | /// Gets a readout module with the specified name or class name. (Returns null if not found.) |
/// </summary> | /// </summary> |
public static ReadoutModule GetReadout(string name) | public static ReadoutModule GetReadout(string name) |
{ | { |
return readouts.FirstOrDefault(r => r.Name == name || r.GetType().Name == name || r.Category + "." + r.GetType().Name == name); | return readouts.FirstOrDefault(r => r.Name == name || r.GetType().Name == name || r.Category + "." + r.GetType().Name == name); |
} | } |
/// <summary> | /// <summary> |
/// Resets all the readout modules. | /// Resets all the readout modules. |
/// </summary> | /// </summary> |
public static void Reset() | public static void Reset() |
{ | { |
foreach (ReadoutModule readout in readouts) | foreach (ReadoutModule readout in readouts) |
{ | { |
readout.Reset(); | readout.Reset(); |
} | } |
} | } |
/// <summary> | /// <summary> |
/// Loads the help strings from file. | /// Loads the help strings from file. |
/// </summary> | /// </summary> |
private static void LoadHelpStrings() | private static void LoadHelpStrings() |
{ | { |
try | try |
{ | { |
SettingHandler handler = SettingHandler.Load("HelpStrings.xml"); | SettingHandler handler = SettingHandler.Load("HelpStrings.xml"); |
foreach (ReadoutModule readout in readouts) | foreach (ReadoutModule readout in readouts) |
{ | { |
readout.HelpString = handler.GetSet(readout.Category + "." + readout.GetType().Name, readout.HelpString); | readout.HelpString = handler.GetSet(readout.Category + "." + readout.GetType().Name, readout.HelpString); |
} | } |
handler.Save("HelpStrings.xml"); | handler.Save("HelpStrings.xml"); |
} | } |
catch (Exception ex) | catch (Exception ex) |
{ | { |
Logger.Exception(ex); | Logger.Exception(ex); |
} | } |
} | } |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer.Flight.Readouts.Vessel | namespace KerbalEngineer.Flight.Readouts.Vessel |
{ | { |
#region Using Directives | #region Using Directives |
using UnityEngine; | using UnityEngine; |
#endregion | #endregion |
public class AttitudeProcessor : IUpdatable, IUpdateRequest | public class AttitudeProcessor : IUpdatable, IUpdateRequest |
{ | { |
#region Fields | #region Fields |
private static readonly AttitudeProcessor instance = new AttitudeProcessor(); | private static readonly AttitudeProcessor instance = new AttitudeProcessor(); |
private Vector3 centreOfMass = Vector3.zero; | private Vector3 centreOfMass = Vector3.zero; |
private double heading; | private double heading; |
private double headingRate; | private double headingRate; |
private Vector3 north = Vector3.zero; | private Vector3 north = Vector3.zero; |
private double pitch; | private double pitch; |
private double pitchRate; | private double pitchRate; |
private double previousHeading; | private double previousHeading; |
private double previousPitch; | private double previousPitch; |
private double previousRoll; | private double previousRoll; |
private double roll; | private double roll; |
private double rollRate; | private double rollRate; |
private Quaternion surfaceRotation; | private Quaternion surfaceRotation; |
private Vector3 up = Vector3.zero; | private Vector3 up = Vector3.zero; |
#endregion | #endregion |
#region Properties | #region Properties |
public static double Heading | public static double Heading |
{ | { |
get { return instance.heading; } | get { return instance.heading; } |
} | } |
public static double HeadingRate | public static double HeadingRate |
{ | { |
get { return instance.headingRate; } | get { return instance.headingRate; } |
} | } |
public static AttitudeProcessor Instance | public static AttitudeProcessor Instance |
{ | { |
get { return instance; } | get { return instance; } |
} | } |
public static double Pitch | public static double Pitch |
{ | { |
get { return instance.pitch; } | get { return instance.pitch; } |
} | } |
public static double PitchRate | public static double PitchRate |
{ | { |
get { return instance.pitchRate; } | get { return instance.pitchRate; } |
} | } |
public static double Roll | public static double Roll |
{ | { |
get { return instance.roll; } | get { return instance.roll; } |
} | } |
public static double RollRate | public static double RollRate |
{ | { |
get { return instance.rollRate; } | get { return instance.rollRate; } |
} | } |
public bool UpdateRequested { get; set; } | public bool UpdateRequested { get; set; } |
#endregion | #endregion |
#region Methods | #region Methods |
public static void RequestUpdate() | public static void RequestUpdate() |
{ | { |
instance.UpdateRequested = true; | instance.UpdateRequested = true; |
} | } |
public void Update() | public void Update() |
{ | { |
this.surfaceRotation = this.GetSurfaceRotation(); | this.surfaceRotation = this.GetSurfaceRotation(); |
this.previousHeading = this.heading; | this.previousHeading = this.heading; |
this.previousPitch = this.pitch; | this.previousPitch = this.pitch; |
this.previousRoll = this.roll; | this.previousRoll = this.roll; |
// This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation. | // This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation. |
this.heading = this.surfaceRotation.eulerAngles.y; | this.heading = this.surfaceRotation.eulerAngles.y; |
this.pitch = this.surfaceRotation.eulerAngles.x > 180.0f | this.pitch = this.surfaceRotation.eulerAngles.x > 180.0f |
? 360.0f - this.surfaceRotation.eulerAngles.x | ? 360.0f - this.surfaceRotation.eulerAngles.x |
: -this.surfaceRotation.eulerAngles.x; | : -this.surfaceRotation.eulerAngles.x; |
this.roll = this.surfaceRotation.eulerAngles.z > 180.0f | this.roll = this.surfaceRotation.eulerAngles.z > 180.0f |
? this.surfaceRotation.eulerAngles.z - 360.0f | ? 360.0f - this.surfaceRotation.eulerAngles.z |
: this.surfaceRotation.eulerAngles.z; | : -this.surfaceRotation.eulerAngles.z; |
this.headingRate = this.heading - this.previousHeading; | this.headingRate = this.heading - this.previousHeading; |
this.pitchRate = this.pitch - this.previousPitch; | this.pitchRate = this.pitch - this.previousPitch; |
this.rollRate = this.roll - this.previousRoll; | this.rollRate = this.roll - this.previousRoll; |
} | } |
private Quaternion GetSurfaceRotation() | private Quaternion GetSurfaceRotation() |
{ | { |
// This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation. | // This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation. |
this.centreOfMass = FlightGlobals.ActiveVessel.findWorldCenterOfMass(); | this.centreOfMass = FlightGlobals.ActiveVessel.findWorldCenterOfMass(); |
this.up = (this.centreOfMass - FlightGlobals.ActiveVessel.mainBody.position).normalized; | this.up = (this.centreOfMass - FlightGlobals.ActiveVessel.mainBody.position).normalized; |
this.north = Vector3.ProjectOnPlane((FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - this.centreOfMass, this.up).normalized; | this.north = Vector3.ProjectOnPlane((FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - this.centreOfMass, this.up).normalized; |
return Quaternion.Inverse(Quaternion.Euler(90.0f, 0.0f, 0.0f) * Quaternion.Inverse(FlightGlobals.ActiveVessel.transform.rotation) * Quaternion.LookRotation(this.north, this.up)); | return Quaternion.Inverse(Quaternion.Euler(90.0f, 0.0f, 0.0f) * Quaternion.Inverse(FlightGlobals.ActiveVessel.transform.rotation) * Quaternion.LookRotation(this.north, this.up)); |
} | } |
#endregion | #endregion |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Copyright (C) 2015 CYBUTEK |
// | |
// Copyright (C) 2014 CYBUTEK | |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | |
using System; | |
using KerbalEngineer.Settings; | |
#endregion | |
namespace KerbalEngineer.Helpers | namespace KerbalEngineer.Helpers |
{ | { |
public static class TimeFormatter | public static class TimeFormatter |
{ | { |
#region Constructors | |
static TimeFormatter() | |
{ | |
SetReference(false); | |
Load(); | |
} | |
#endregion | |
#region Properties | |
public static string Reference { get; set; } | |
public static double SecondsPerDay { get; set; } | |
public static double SecondsPerHour { get; set; } | |
public static double SecondsPerMinute { get; set; } | |
public static double SecondsPerYear { get; set; } | |
#endregion | |
#region Methods: public | |
public static string ConvertToString(double seconds, string format = "F1") | public static string ConvertToString(double seconds, string format = "F1") |
{ | { |
var years = 0; | int years = 0; |
var days = 0; | int days = 0; |
var hours = 0; | int hours = 0; |
var minutes = 0; | int minutes = 0; |
if (seconds > 0) | if (seconds > 0.0) |
{ | { |
years = (int)(seconds / SecondsPerYear); | years = (int)(seconds / KSPUtil.dateTimeFormatter.Year); |
seconds -= years * SecondsPerYear; | seconds -= years * KSPUtil.dateTimeFormatter.Year; |
days = (int)(seconds / SecondsPerDay); | days = (int)(seconds / KSPUtil.dateTimeFormatter.Day); |
seconds -= days * SecondsPerDay; | seconds -= days * KSPUtil.dateTimeFormatter.Day; |
hours = (int)(seconds / SecondsPerHour); | hours = (int)(seconds / 3600.0); |
seconds -= hours * SecondsPerHour; | seconds -= hours * 3600.0; |
minutes = (int)(seconds / SecondsPerMinute); | minutes = (int)(seconds / 60.0); |
seconds -= minutes * SecondsPerMinute; | seconds -= minutes * 60.0; |
} | } |
if (years > 0) | if (years > 0) |
{ | { |
return String.Format("{0}y {1}d {2}h {3}m {4}s", years, days, hours, minutes, seconds.ToString(format)); | return string.Format("{0}y {1}d {2}h {3}m {4}s", years, days, hours, minutes, seconds.ToString(format)); |
} | } |
if (days > 0) | if (days > 0) |
{ | { |
return String.Format("{0}d {1}h {2}m {3}s", days, hours, minutes, seconds.ToString(format)); | return string.Format("{0}d {1}h {2}m {3}s", days, hours, minutes, seconds.ToString(format)); |
} | } |
if (hours > 0) | if (hours > 0) |
{ | { |
return String.Format("{0}h {1}m {2}s", hours, minutes, seconds.ToString(format)); | return string.Format("{0}h {1}m {2}s", hours, minutes, seconds.ToString(format)); |
} | } |
return minutes > 0 ? String.Format("{0}m {1}s", minutes, seconds.ToString(format)) : String.Format("{0}s", seconds.ToString(format)); | return minutes > 0 ? string.Format("{0}m {1}s", minutes, seconds.ToString(format)) : string.Format("{0}s", seconds.ToString(format)); |
} | } |
public static void Load() | |
{ | |
var handler = SettingHandler.Load("TimeFormatter.xml"); | |
SecondsPerMinute = handler.Get("SecondsPerMinute", SecondsPerMinute); | |
SecondsPerHour = handler.Get("SecondsPerHour", SecondsPerHour); | |
SecondsPerDay = handler.Get("SecondsPerDay", SecondsPerDay); | |
SecondsPerYear = handler.Get("SecondsPerYear", SecondsPerYear); | |
Reference = handler.Get("Reference", Reference); | |
} | |
public static void Save() | |
{ | |
var handler = SettingHandler.Load("TimeFormatter.xml"); | |
handler.Set("SecondsPerMinute", SecondsPerMinute); | |
handler.Set("SecondsPerHour", SecondsPerHour); | |
handler.Set("SecondsPerDay", SecondsPerDay); | |
handler.Set("SecondsPerYear", SecondsPerYear); | |
handler.Set("Reference", Reference); | |
handler.Save("TimeFormatter.xml"); | |
} | |
public static void SetReference(bool save = true) | |
{ | |
const double minute = 60.0; | |
const double hour = minute * 60.0; | |
const double day = hour * 24.0; | |
const double year = day * 365.0; | |
SetReference(minute, hour, day, year, "Earth", save); | |
} | |
public static void SetReference(CelestialBody body, bool save = true) | |
{ | |
SetReference(SecondsPerMinute, SecondsPerHour, body.rotationPeriod, body.orbit.period, body.bodyName, save); | |
} | |
public static void SetReference(double minute, double hour, double day, double year, string reference, bool save = true) | |
{ | |
SecondsPerMinute = minute; | |
SecondsPerHour = hour; | |
SecondsPerDay = day; | |
SecondsPerYear = year; | |
Reference = reference; | |
if (save) | |
{ | |
Save(); | |
} | |
} | |
public new static string ToString() | |
{ | |
return String.Format("SecondsPerMinute: {0}", SecondsPerMinute) + Environment.NewLine + | |
String.Format("SecondsPerHour: {0}", SecondsPerHour) + Environment.NewLine + | |
String.Format("SecondsPerDay: {0}", SecondsPerDay) + Environment.NewLine + | |
String.Format("SecondsPerYear: {0}", SecondsPerYear) + Environment.NewLine; | |
} | |
#endregion | |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2015 CYBUTEK | // Copyright (C) 2015 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer.Helpers | namespace KerbalEngineer.Helpers |
{ | { |
using System; | using System; |
public static class Units | public static class Units |
{ | { |
public const double GRAVITY = 9.80665; | public const double GRAVITY = 9.80665; |
public const double RAD_TO_DEG = 180.0 / Math.PI; | |
public const double DEG_TO_RAD = Math.PI / 180.0; | |
public static string Concat(int value1, int value2) | public static string Concat(int value1, int value2) |
{ | { |
return value1 + " / " + value2; | return value1 + " / " + value2; |
} | } |
public static string ConcatF(double value1, double value2, int decimals = 1) | public static string ConcatF(double value1, double value2, int decimals = 1) |
{ | { |
return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals); | return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals); |
} | } |
public static string ConcatF(double value1, double value2, double value3, int decimals = 1) | public static string ConcatF(double value1, double value2, double value3, int decimals = 1) |
{ | { |
return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals) + " / " + value3.ToString("F" + decimals); | return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals) + " / " + value3.ToString("F" + decimals); |
} | } |
public static string ConcatN(double value1, double value2, int decimals = 1) | public static string ConcatN(double value1, double value2, int decimals = 1) |
{ | { |
return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals); | return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals); |
} | } |
public static string ConcatN(double value1, double value2, double value3, int decimals = 1) | public static string ConcatN(double value1, double value2, double value3, int decimals = 1) |
{ | { |
return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + " / " + value3.ToString("N" + decimals); | return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + " / " + value3.ToString("N" + decimals); |
} | } |
public static string Cost(double value, int decimals = 1) | public static string Cost(double value, int decimals = 1) |
{ | { |
if (value >= 1000000.0) | if (value >= 1000000.0) |
{ | { |
return (value / 1000.0).ToString("N" + decimals) + "K"; | return (value / 1000.0).ToString("N" + decimals) + "K"; |
} | } |
return value.ToString("N" + decimals); | return value.ToString("N" + decimals); |
} | } |
public static string Cost(double value1, double value2, int decimals = 1) | public static string Cost(double value1, double value2, int decimals = 1) |
{ | { |
if (value1 >= 1000000.0 || value2 >= 1000000.0) | if (value1 >= 1000000.0 || value2 >= 1000000.0) |
{ | { |
return (value1 / 1000.0).ToString("N" + decimals) + " / " + (value2 / 1000.0).ToString("N" + decimals) + "K"; | return (value1 / 1000.0).ToString("N" + decimals) + " / " + (value2 / 1000.0).ToString("N" + decimals) + "K"; |
} | } |
return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals); | return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals); |
} | } |
public static string ToAcceleration(double value, int decimals = 2) | public static string ToAcceleration(double value, int decimals = 2) |
{ | { |
return value.ToString("N" + decimals) + "m/s²"; | return value.ToString("N" + decimals) + "m/s²"; |
} | } |
public static string ToAcceleration(double value1, double value2, int decimals = 2) | public static string ToAcceleration(double value1, double value2, int decimals = 2) |
{ | { |
return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + "m/s²"; | return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + "m/s²"; |
} | } |
public static string ToAngle(double value, int decimals = 5) | public static string ToAngle(double value, int decimals = 5) |
{ | { |
return value.ToString("F" + decimals) + "°"; | return value.ToString("F" + decimals) + "°"; |
} | } |
public static string ToAngleDMS(double value) | public static string ToAngleDMS(double value) |
{ | { |
double absAngle = Math.Abs(value); | double absAngle = Math.Abs(value); |
int deg = (int)Math.Floor(absAngle); | int deg = (int)Math.Floor(absAngle); |
double rem = absAngle - deg; | double rem = absAngle - deg; |
int min = (int)Math.Floor(rem * 60); | int min = (int)Math.Floor(rem * 60); |
rem -= ((double)min / 60); | rem -= ((double)min / 60); |
int sec = (int)Math.Floor(rem * 3600); | int sec = (int)Math.Floor(rem * 3600); |
return String.Format("{0:0}° {1:00}' {2:00}\"", deg, min, sec); | return string.Format("{0:0}° {1:00}' {2:00}\"", deg, min, sec); |
} | } |
public static string ToDistance(double value, int decimals = 1) | public static string ToDistance(double value, int decimals = 1) |
{ | { |
if (Math.Abs(value) < 1000000.0) | if (Math.Abs(value) < 1000000.0) |
{ | { |
if (Math.Abs(value) >= 10.0) | if (Math.Abs(value) >= 10.0) |
{ | { |
return value.ToString("N" + decimals) + "m"; | return value.ToString("N" + decimals) + "m"; |
} | } |
value *= 100.0; | value *= 100.0; |
if (Math.Abs(value) >= 100.0) | if (Math.Abs(value) >= 100.0) |
{ | { |
return value.ToString("N" + decimals) + "cm"; | return value.ToString("N" + decimals) + "cm"; |
} | } |
value *= 10.0; | value *= 10.0; |
return value.ToString("N" + decimals) + "mm"; | return value.ToString("N" + decimals) + "mm"; |
} | } |
value /= 1000.0; | value /= 1000.0; |
if (Math.Abs(value) < 1000000.0) | if (Math.Abs(value) < 1000000.0) |
{ | { |
return value.ToString("N" + decimals) + "km"; | return value.ToString("N" + decimals) + "km"; |
} | } |
value /= 1000.0; | value /= 1000.0; |
return value.ToString("N" + decimals) + "Mm"; | return value.ToString("N" + decimals) + "Mm"; |
} | } |
public static string ToFlux(double value) | public static string ToFlux(double value) |
{ | { |
return value.ToString("#,0.00") + "W"; | return value.ToString("#,0.00") + "kW"; |
} | } |
public static string ToForce(double value) | public static string ToForce(double value) |
{ | { |
return value.ToString((value < 100000.0) ? (value < 10000.0) ? (value < 100.0) ? (Math.Abs(value) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0") + "kN"; | return value.ToString((value < 100000.0) ? (value < 10000.0) ? (value < 100.0) ? (Math.Abs(value) < double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0") + "kN"; |
} | } |
public static string ToForce(double value1, double value2) | public static string ToForce(double value1, double value2) |
{ | { |
string format1 = (value1 < 100000.0) ? (value1 < 10000.0) ? (value1 < 100.0) ? (Math.Abs(value1) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0"; | string format1 = (value1 < 100000.0) ? (value1 < 10000.0) ? (value1 < 100.0) ? (Math.Abs(value1) < double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0"; |
string format2 = (value2 < 100000.0) ? (value2 < 10000.0) ? (value2 < 100.0) ? (Math.Abs(value2) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0"; | string format2 = (value2 < 100000.0) ? (value2 < 10000.0) ? (value2 < 100.0) ? (Math.Abs(value2) < double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0"; |
return value1.ToString(format1) + " / " + value2.ToString(format2) + "kN"; | return value1.ToString(format1) + " / " + value2.ToString(format2) + "kN"; |
} | } |
public static string ToMach(double value) | public static string ToMach(double value) |
{ | { |
return value.ToString("0.00") + "Ma"; | return value.ToString("0.00") + "Ma"; |
} | } |
public static string ToMass(double value, int decimals = 0) | public static string ToMass(double value, int decimals = 0) |
{ | { |
if (value >= 1000.0) | if (value >= 1000.0) |
{ | { |
return value.ToString("N" + decimals + 2) + "t"; | return value.ToString("N" + decimals + 2) + "t"; |
} | } |
value *= 1000.0; | value *= 1000.0; |
return value.ToString("N" + decimals) + "kg"; | return value.ToString("N" + decimals) + "kg"; |
} | } |
public static string ToMass(double value1, double value2, int decimals = 0) | public static string ToMass(double value1, double value2, int decimals = 0) |
{ | { |
if (value1 >= 1000.0f || value2 >= 1000.0f) | if (value1 >= 1000.0f || value2 >= 1000.0f) |
{ | { |
return value1.ToString("N" + decimals + 2) + " / " + value2.ToString("N" + decimals + 2) + "t"; | return value1.ToString("N" + decimals + 2) + " / " + value2.ToString("N" + decimals + 2) + "t"; |
} | } |
value1 *= 1000.0; | value1 *= 1000.0; |
value2 *= 1000.0; | value2 *= 1000.0; |
return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + "kg"; | return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + "kg"; |
} | } |
public static string ToPercent(double value, int decimals = 2) | public static string ToPercent(double value, int decimals = 2) |
{ | { |
value *= 100.0; | value *= 100.0; |
return value.ToString("F" + decimals) + "%"; | return value.ToString("F" + decimals) + "%"; |
} | } |
public static string ToRate(double value, int decimals = 1) | public static string ToRate(double value, int decimals = 1) |
{ | { |
return value < 1.0 ? (value * 60.0).ToString("F" + decimals) + "/min" : value.ToString("F" + decimals) + "/sec"; | return value < 1.0 ? (value * 60.0).ToString("F" + decimals) + "/min" : value.ToString("F" + decimals) + "/sec"; |
} | } |
public static string ToSpeed(double value, int decimals = 2) | public static string ToSpeed(double value, int decimals = 2) |
{ | { |
if (Math.Abs(value) < 1.0) | if (Math.Abs(value) < 1.0) |
{ | { |
return (value * 1000.0).ToString("N" + decimals) + "mm/s"; | return (value * 1000.0).ToString("N" + decimals) + "mm/s"; |
} | } |
return value.ToString("N" + decimals) + "m/s"; | return value.ToString("N" + decimals) + "m/s"; |
} | } |
public static string ToTemperature(double value) | public static string ToTemperature(double value) |
{ | { |
return value.ToString("#,0") + "K"; | return value.ToString("#,0") + "K"; |
} | } |
public static string ToTemperature(double value1, double value2) | public static string ToTemperature(double value1, double value2) |
{ | { |
return value1.ToString("#,0") + " / " + value2.ToString("#,0") + "K"; | return value1.ToString("#,0") + " / " + value2.ToString("#,0") + "K"; |
} | } |
public static string ToTime(double value) | public static string ToTime(double value) |
{ | { |
return TimeFormatter.ConvertToString(value); | return TimeFormatter.ConvertToString(value); |
} | } |
public static string ToTorque(double value) | public static string ToTorque(double value) |
{ | { |
return value.ToString((value < 100.0) ? (Math.Abs(value) < Double.Epsilon) ? "N0" : "N2" : "N0") + "kNm"; | return value.ToString((value < 100.0) ? (Math.Abs(value) < double.Epsilon) ? "N0" : "N2" : "N0") + "kNm"; |
} | } |
} | } |
} | } |
namespace KerbalEngineer.Helpers | |
{ | |
using System; | |
using System.IO; | |
using System.Text; | |
using System.Xml.Serialization; | |
public static class XmlHelper | |
{ | |
/// <summary> | |
/// Loads an object from disk. | |
/// </summary> | |
public static T LoadObject<T>(string path) | |
{ | |
T obj = default(T); | |
if (File.Exists(path)) | |
{ | |
try | |
{ | |
using (StreamReader stream = new StreamReader(path, Encoding.UTF8)) | |
{ | |
obj = (T)new XmlSerializer(typeof(T)).Deserialize(stream); | |
} | |
} | |
catch (Exception ex) | |
{ | |
Logger.Exception(ex); | |
} | |
} | |
return obj; | |
} | |
/// <summary> | |
/// Loads and object from disk. | |
/// </summary> | |
public static bool LoadObject<T>(string path, out T obj) | |
{ | |
obj = LoadObject<T>(path); | |
return (obj != null); | |
} | |
/// <summary> | |
/// Saves an object to disk. | |
/// </summary> | |
public static void SaveObject<T>(string path, T obj) | |
{ | |
if (obj == null || string.IsNullOrEmpty(path)) | |
{ | |
return; | |
} | |
try | |
{ | |
using (StreamWriter stream = new StreamWriter(path, false, Encoding.UTF8)) | |
{ | |
new XmlSerializer(typeof(T)).Serialize(stream, obj); | |
} | |
} | |
catch (Exception ex) | |
{ | |
Logger.Exception(ex); | |
} | |
} | |
} | |
} |
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> |
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> |
<PropertyGroup> | <PropertyGroup> |
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
<ProjectGuid>{39806613-E0B7-46E0-89A6-A569EC538CBB}</ProjectGuid> | <ProjectGuid>{39806613-E0B7-46E0-89A6-A569EC538CBB}</ProjectGuid> |
<OutputType>Library</OutputType> | <OutputType>Library</OutputType> |
<AppDesignerFolder>Properties</AppDesignerFolder> | <AppDesignerFolder>Properties</AppDesignerFolder> |
<RootNamespace>KerbalEngineer</RootNamespace> | <RootNamespace>KerbalEngineer</RootNamespace> |
<AssemblyName>KerbalEngineer</AssemblyName> | <AssemblyName>KerbalEngineer</AssemblyName> |
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> | <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
<FileAlignment>512</FileAlignment> | <FileAlignment>512</FileAlignment> |
</PropertyGroup> | </PropertyGroup> |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
<DebugSymbols>false</DebugSymbols> | <DebugSymbols>false</DebugSymbols> |
<DebugType>none</DebugType> | <DebugType>none</DebugType> |
<Optimize>false</Optimize> | <Optimize>false</Optimize> |
<OutputPath>..\Output\KerbalEngineer\</OutputPath> | <OutputPath>..\Output\KerbalEngineer\</OutputPath> |
<DefineConstants>DEBUG;TRACE</DefineConstants> | <DefineConstants>DEBUG;TRACE</DefineConstants> |
<ErrorReport>prompt</ErrorReport> | <ErrorReport>prompt</ErrorReport> |
<WarningLevel>4</WarningLevel> | <WarningLevel>4</WarningLevel> |
<UseVSHostingProcess>false</UseVSHostingProcess> | <UseVSHostingProcess>false</UseVSHostingProcess> |
</PropertyGroup> | </PropertyGroup> |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
<DebugType>none</DebugType> | <DebugType>none</DebugType> |
<Optimize>true</Optimize> | <Optimize>true</Optimize> |
<OutputPath>..\Output\KerbalEngineer\</OutputPath> | <OutputPath>..\Output\KerbalEngineer\</OutputPath> |
<DefineConstants> | <DefineConstants> |
</DefineConstants> | </DefineConstants> |
<ErrorReport>prompt</ErrorReport> | <ErrorReport>prompt</ErrorReport> |
<WarningLevel>4</WarningLevel> | <WarningLevel>4</WarningLevel> |
<UseVSHostingProcess>false</UseVSHostingProcess> | <UseVSHostingProcess>false</UseVSHostingProcess> |
<AllowUnsafeBlocks>false</AllowUnsafeBlocks> | <AllowUnsafeBlocks>false</AllowUnsafeBlocks> |
</PropertyGroup> | </PropertyGroup> |
<ItemGroup> | <ItemGroup> |
<Compile Include="AppLauncherButton.cs" /> | |
<Compile Include="AssetBundleLoader.cs" /> | |
<Compile Include="Control\IControlPanel.cs" /> | <Compile Include="Control\IControlPanel.cs" /> |
<Compile Include="Control\Panels\BuildOverlayPanel.cs" /> | <Compile Include="Control\Panels\BuildOverlayPanel.cs" /> |
<Compile Include="Control\Panels\BuildEngineerPanel.cs" /> | <Compile Include="Control\Panels\BuildEngineerPanel.cs" /> |
<Compile Include="Editor\BuildAdvanced.cs" /> | <Compile Include="Editor\BuildAdvanced.cs" /> |
<Compile Include="Editor\BuildAppLauncher.cs" /> | |
<Compile Include="Editor\BuildOverlay.cs" /> | <Compile Include="Editor\BuildOverlay.cs" /> |
<Compile Include="CelestialBodies.cs" /> | <Compile Include="CelestialBodies.cs" /> |
<Compile Include="Editor\BuildOverlayPartInfo.cs" /> | <Compile Include="Editor\BuildOverlayPartInfo.cs" /> |
<Compile Include="Editor\BuildOverlayResources.cs" /> | <Compile Include="Editor\BuildOverlayResources.cs" /> |
<Compile Include="Editor\BuildOverlayVessel.cs" /> | <Compile Include="Editor\BuildOverlayVessel.cs" /> |
<Compile Include="Editor\BuildToolbar.cs" /> | |
<Compile Include="Editor\PartInfoItem.cs" /> | <Compile Include="Editor\PartInfoItem.cs" /> |
<Compile Include="Editor\ResourceInfoItem.cs" /> | <Compile Include="Editor\ResourceInfoItem.cs" /> |
<Compile Include="Extensions\FloatExtensions.cs" /> | <Compile Include="Extensions\FloatExtensions.cs" /> |
<Compile Include="Extensions\OrbitExtensions.cs" /> | <Compile Include="Extensions\OrbitExtensions.cs" /> |
<Compile Include="Extensions\StringExtensions.cs" /> | <Compile Include="Extensions\StringExtensions.cs" /> |
<Compile Include="Flight\ActionMenuGui.cs" /> | <Compile Include="Flight\ActionMenuGui.cs" /> |
<Compile Include="Flight\FlightAppLauncher.cs" /> | |
<Compile Include="Flight\Presets\Preset.cs" /> | <Compile Include="Flight\Presets\Preset.cs" /> |
<Compile Include="Flight\Readouts\Miscellaneous\SystemTime.cs" /> | <Compile Include="Flight\Readouts\Miscellaneous\SystemTime.cs" /> |
<Compile Include="Flight\Readouts\Miscellaneous\VectoredThrustToggle.cs" /> | <Compile Include="Flight\Readouts\Miscellaneous\VectoredThrustToggle.cs" /> |
<Compile Include="Flight\Readouts\Miscellaneous\TimeReference.cs" /> | |
<Compile Include="Flight\Readouts\Miscellaneous\Separator.cs" /> | <Compile Include="Flight\Readouts\Miscellaneous\Separator.cs" /> |
<Compile Include="Flight\Readouts\Miscellaneous\GuiSizeAdjustor.cs" /> | <Compile Include="Flight\Readouts\Miscellaneous\GuiSizeAdjustor.cs" /> |
<Compile Include="Flight\Readouts\Orbital\AngleToEquatorialDescendingNode.cs" /> | <Compile Include="Flight\Readouts\Orbital\AngleToEquatorialDescendingNode.cs" /> |
<Compile Include="Flight\Readouts\Orbital\AngleToEquatorialAscendingNode.cs" /> | <Compile Include="Flight\Readouts\Orbital\AngleToEquatorialAscendingNode.cs" /> |
<Compile Include="Flight\Readouts\Orbital\AngleToRetrograde.cs" /> | <Compile Include="Flight\Readouts\Orbital\AngleToRetrograde.cs" /> |
<Compile Include="Flight\Readouts\Orbital\AngleToPrograde.cs" /> | <Compile Include="Flight\Readouts\Orbital\AngleToPrograde.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeRadialDeltaV.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeRadialDeltaV.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\ManoeuvreProcessor.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\ManoeuvreProcessor.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTimeToHalfBurn.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTimeToHalfBurn.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTimeToManoeuvre.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTimeToManoeuvre.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeHalfBurnTime.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeHalfBurnTime.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeBurnTime.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeBurnTime.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeAngleToRetrograde.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeAngleToRetrograde.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeNormalDeltaV.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeNormalDeltaV.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeAngleToPrograde.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeAngleToPrograde.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTotalDeltaV.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTotalDeltaV.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeProgradeDeltaV.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeProgradeDeltaV.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\PostBurnApoapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\PostBurnApoapsis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\PostBurnPeriapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\PostBurnPeriapsis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\MeanAnomalyAtEpoc.cs" /> | <Compile Include="Flight\Readouts\Orbital\MeanAnomalyAtEpoc.cs" /> |
<Compile Include="Flight\Readouts\Orbital\MeanAnomaly.cs" /> | <Compile Include="Flight\Readouts\Orbital\MeanAnomaly.cs" /> |
<Compile Include="Flight\Readouts\Orbital\EccentricAnomaly.cs" /> | <Compile Include="Flight\Readouts\Orbital\EccentricAnomaly.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ArgumentOfPeriapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\ArgumentOfPeriapsis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\CurrentSoi.cs" /> | <Compile Include="Flight\Readouts\Orbital\CurrentSoi.cs" /> |
<Compile Include="Flight\Readouts\Orbital\SemiMajorAxis.cs"> | <Compile Include="Flight\Readouts\Orbital\SemiMajorAxis.cs"> |
<SubType>Code</SubType> | <SubType>Code</SubType> |
</Compile> | </Compile> |
<Compile Include="Flight\Readouts\Orbital\SpeedAtApoapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\SpeedAtApoapsis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\SpeedAtPeriapsis.cs"> | <Compile Include="Flight\Readouts\Orbital\SpeedAtPeriapsis.cs"> |
<SubType>Code</SubType> | <SubType>Code</SubType> |
</Compile> | </Compile> |
<Compile Include="Flight\Readouts\Orbital\TimeToAtmosphere.cs" /> | <Compile Include="Flight\Readouts\Orbital\TimeToAtmosphere.cs" /> |
<Compile Include="Flight\Readouts\Orbital\TrueAnomaly.cs" /> | <Compile Include="Flight\Readouts\Orbital\TrueAnomaly.cs" /> |
<Compile Include="Flight\Readouts\Orbital\TimeToEquatorialAscendingNode.cs" /> | <Compile Include="Flight\Readouts\Orbital\TimeToEquatorialAscendingNode.cs" /> |
<Compile Include="Flight\Readouts\Orbital\TimeToEquatorialDescendingNode.cs" /> | <Compile Include="Flight\Readouts\Orbital\TimeToEquatorialDescendingNode.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\RelativeSpeed.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\RelativeSpeed.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\RelativeVelocity.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\RelativeVelocity.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\SemiMinorAxis.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\SemiMinorAxis.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\SemiMajorAxis.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\SemiMajorAxis.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\TimeToRelativeDescendingNode.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\TimeToRelativeDescendingNode.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\TimeToRelativeAscendingNode.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\TimeToRelativeAscendingNode.cs" /> |
<Compile Include="Flight\Readouts\Surface\ImpactBiome.cs" /> | <Compile Include="Flight\Readouts\Surface\ImpactBiome.cs" /> |
<Compile Include="Flight\Readouts\Surface\Slope.cs" /> | <Compile Include="Flight\Readouts\Surface\Slope.cs" /> |
<Compile Include="Flight\Readouts\Surface\Biome.cs" /> | <Compile Include="Flight\Readouts\Surface\Biome.cs" /> |
<Compile Include="Flight\Readouts\Surface\HorizontalAcceleration.cs" /> | <Compile Include="Flight\Readouts\Surface\HorizontalAcceleration.cs" /> |
<Compile Include="Flight\Readouts\Surface\VerticalAcceleration.cs" /> | <Compile Include="Flight\Readouts\Surface\VerticalAcceleration.cs" /> |
<Compile Include="Flight\Readouts\Surface\MachNumber.cs" /> | <Compile Include="Flight\Readouts\Surface\MachNumber.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CoolestSkinTemperature.cs" /> | <Compile Include="Flight\Readouts\Thermal\CoolestSkinTemperature.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CriticalPart.cs" /> | <Compile Include="Flight\Readouts\Thermal\CriticalPart.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CoolestPart.cs" /> | <Compile Include="Flight\Readouts\Thermal\CoolestPart.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CoolestTemperature.cs" /> | <Compile Include="Flight\Readouts\Thermal\CoolestTemperature.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CriticalThermalPercentage.cs" /> | <Compile Include="Flight\Readouts\Thermal\CriticalThermalPercentage.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CriticalSkinTemperature.cs" /> | <Compile Include="Flight\Readouts\Thermal\CriticalSkinTemperature.cs" /> |
<Compile Include="Flight\Readouts\Thermal\CriticalTemperature.cs" /> | <Compile Include="Flight\Readouts\Thermal\CriticalTemperature.cs" /> |
<Compile Include="Flight\Readouts\Thermal\HottestSkinTemperature.cs" /> | <Compile Include="Flight\Readouts\Thermal\HottestSkinTemperature.cs" /> |
<Compile Include="Flight\Readouts\Thermal\InternalFlux.cs" /> | <Compile Include="Flight\Readouts\Thermal\InternalFlux.cs" /> |
<Compile Include="Flight\Readouts\Thermal\RadiationFlux.cs" /> | <Compile Include="Flight\Readouts\Thermal\RadiationFlux.cs" /> |
<Compile Include="Flight\Readouts\Thermal\ConvectionFlux.cs" /> | <Compile Include="Flight\Readouts\Thermal\ConvectionFlux.cs" /> |
<Compile Include="Flight\Readouts\Thermal\HottestTemperature.cs" /> | <Compile Include="Flight\Readouts\Thermal\HottestTemperature.cs" /> |
<Compile Include="Flight\Readouts\Thermal\HottestPart.cs" /> | <Compile Include="Flight\Readouts\Thermal\HottestPart.cs" /> |
<Compile Include="Flight\Readouts\Thermal\ThermalProcessor.cs" /> | <Compile Include="Flight\Readouts\Thermal\ThermalProcessor.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Name.cs" /> | <Compile Include="Flight\Readouts\Vessel\Name.cs" /> |
<Compile Include="Flight\Readouts\Vessel\AttitudeProcessor.cs" /> | <Compile Include="Flight\Readouts\Vessel\AttitudeProcessor.cs" /> |
<Compile Include="Flight\Readouts\Vessel\DeltaVCurrentTotal.cs" /> | <Compile Include="Flight\Readouts\Vessel\DeltaVCurrentTotal.cs" /> |
<Compile Include="Flight\Readouts\Vessel\PitchRate.cs" /> | <Compile Include="Flight\Readouts\Vessel\PitchRate.cs" /> |
<Compile Include="Flight\Readouts\Vessel\HeadingRate.cs" /> | <Compile Include="Flight\Readouts\Vessel\HeadingRate.cs" /> |
<Compile Include="Flight\Readouts\Vessel\RollRate.cs" /> | <Compile Include="Flight\Readouts\Vessel\RollRate.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Roll.cs" /> | <Compile Include="Flight\Readouts\Vessel\Roll.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Pitch.cs" /> | <Compile Include="Flight\Readouts\Vessel\Pitch.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Heading.cs" /> | <Compile Include="Flight\Readouts\Vessel\Heading.cs" /> |
<Compile Include="Flight\Readouts\Vessel\PartCount.cs" /> | <Compile Include="Flight\Readouts\Vessel\PartCount.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SuicideBurnDeltaV.cs" /> | <Compile Include="Flight\Readouts\Vessel\SuicideBurnDeltaV.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SuicideBurnAltitude.cs" /> | <Compile Include="Flight\Readouts\Vessel\SuicideBurnAltitude.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SuicideBurnDistance.cs" /> | <Compile Include="Flight\Readouts\Vessel\SuicideBurnDistance.cs" /> |
<Compile Include="Flight\Readouts\Vessel\DeltaVCurrent.cs" /> | <Compile Include="Flight\Readouts\Vessel\DeltaVCurrent.cs" /> |
<Compile Include="Flight\Readouts\Vessel\IntakeAirUsage.cs" /> | <Compile Include="Flight\Readouts\Vessel\IntakeAirUsage.cs" /> |
<Compile Include="Flight\Readouts\Vessel\IntakeAirDemandSupply.cs" /> | <Compile Include="Flight\Readouts\Vessel\IntakeAirDemandSupply.cs" /> |
<Compile Include="Flight\Readouts\Vessel\IntakeAirSupply.cs" /> | <Compile Include="Flight\Readouts\Vessel\IntakeAirSupply.cs" /> |
<Compile Include="Flight\Readouts\Vessel\IntakeAirDemand.cs" /> | <Compile Include="Flight\Readouts\Vessel\IntakeAirDemand.cs" /> |
<Compile Include="Flight\Readouts\Miscellaneous\SimulationDelay.cs" /> | <Compile Include="Flight\Readouts\Miscellaneous\SimulationDelay.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SimulationProcessor.cs" /> | <Compile Include="Flight\Readouts\Vessel\SimulationProcessor.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Acceleration.cs" /> | <Compile Include="Flight\Readouts\Vessel\Acceleration.cs" /> |
<Compile Include="Flight\Presets\PresetLibrary.cs" /> | <Compile Include="Flight\Presets\PresetLibrary.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SuicideBurnProcessor.cs" /> | <Compile Include="Flight\Readouts\Vessel\SuicideBurnProcessor.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SurfaceThrustToWeight.cs" /> | <Compile Include="Flight\Readouts\Vessel\SurfaceThrustToWeight.cs" /> |
<Compile Include="Flight\Readouts\Surface\Situation.cs" /> | <Compile Include="Flight\Readouts\Surface\Situation.cs" /> |
<Compile Include="Flight\Readouts\Vessel\ThrustOffsetAngle.cs" /> | <Compile Include="Flight\Readouts\Vessel\ThrustOffsetAngle.cs" /> |
<Compile Include="Flight\Readouts\Vessel\ThrustTorque.cs" /> | <Compile Include="Flight\Readouts\Vessel\ThrustTorque.cs" /> |
<Compile Include="GuiDisplaySize.cs" /> | <Compile Include="GuiDisplaySize.cs" /> |
<Compile Include="Helpers\AngleHelper.cs" /> | <Compile Include="Helpers\AngleHelper.cs" /> |
<Compile Include="Helpers\Averager.cs" /> | <Compile Include="Helpers\Averager.cs" /> |
<Compile Include="Helpers\ForceAccumulator.cs" /> | <Compile Include="Helpers\ForceAccumulator.cs" /> |
<Compile Include="Helpers\TextureHelper.cs" /> | <Compile Include="Helpers\TextureHelper.cs" /> |
<Compile Include="Helpers\Units.cs" /> | <Compile Include="Helpers\Units.cs" /> |
<Compile Include="Helpers\TimeFormatter.cs" /> | <Compile Include="Helpers\TimeFormatter.cs" /> |
<Compile Include="KeyBinder.cs" /> | <Compile Include="Helpers\XmlHelper.cs" /> |
<Compile Include="KeyBinding\KeyBinder.cs" /> | |
<Compile Include="Control\ControlCentre.cs" /> | <Compile Include="Control\ControlCentre.cs" /> |
<Compile Include="KeyBinding\KeyBindingsObject.cs" /> | |
<Compile Include="UIControls\DropDown.cs" /> | <Compile Include="UIControls\DropDown.cs" /> |
<Compile Include="Logger.cs" /> | <Compile Include="Logger.cs" /> |
<Compile Include="EngineerGlobals.cs" /> | <Compile Include="EngineerGlobals.cs" /> |
<Compile Include="Extensions\DoubleExtensions.cs" /> | <Compile Include="Extensions\DoubleExtensions.cs" /> |
<Compile Include="Extensions\PartExtensions.cs" /> | <Compile Include="Extensions\PartExtensions.cs" /> |
<Compile Include="Extensions\PartResourceExtensions.cs" /> | <Compile Include="Extensions\PartResourceExtensions.cs" /> |
<Compile Include="Extensions\RectExtensions.cs" /> | <Compile Include="Extensions\RectExtensions.cs" /> |
<Compile Include="Flight\ActionMenu.cs" /> | <Compile Include="Flight\ActionMenu.cs" /> |
<Compile Include="Flight\DisplayStack.cs" /> | <Compile Include="Flight\DisplayStack.cs" /> |
<Compile Include="Flight\FlightEngineerCore.cs" /> | <Compile Include="Flight\FlightEngineerCore.cs" /> |
<Compile Include="Flight\FlightEngineerModule.cs" /> | <Compile Include="Flight\FlightEngineerModule.cs" /> |
<Compile Include="Flight\IUpdatable.cs" /> | <Compile Include="Flight\IUpdatable.cs" /> |
<Compile Include="Flight\IUpdateRequest.cs" /> | <Compile Include="Flight\IUpdateRequest.cs" /> |
<Compile Include="Flight\Readouts\Orbital\ApoapsisHeight.cs" /> | <Compile Include="Flight\Readouts\Orbital\ApoapsisHeight.cs" /> |
<Compile Include="Flight\Readouts\Orbital\Eccentricity.cs" /> | <Compile Include="Flight\Readouts\Orbital\Eccentricity.cs" /> |
<Compile Include="Flight\Readouts\Orbital\Inclination.cs" /> | <Compile Include="Flight\Readouts\Orbital\Inclination.cs" /> |
<Compile Include="Flight\Readouts\Orbital\LongitudeOfAscendingNode.cs" /> | <Compile Include="Flight\Readouts\Orbital\LongitudeOfAscendingNode.cs" /> |
<Compile Include="Flight\Readouts\Orbital\LongitudeOfPeriapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\LongitudeOfPeriapsis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\OrbitalPeriod.cs" /> | <Compile Include="Flight\Readouts\Orbital\OrbitalPeriod.cs" /> |
<Compile Include="Flight\Readouts\Orbital\OrbitalSpeed.cs" /> | <Compile Include="Flight\Readouts\Orbital\OrbitalSpeed.cs" /> |
<Compile Include="Flight\Readouts\Orbital\PeriapsisHeight.cs" /> | <Compile Include="Flight\Readouts\Orbital\PeriapsisHeight.cs" /> |
<Compile Include="Flight\Readouts\Orbital\SemiMinorAxis.cs" /> | <Compile Include="Flight\Readouts\Orbital\SemiMinorAxis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\TimeToApoapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\TimeToApoapsis.cs" /> |
<Compile Include="Flight\Readouts\Orbital\TimeToPeriapsis.cs" /> | <Compile Include="Flight\Readouts\Orbital\TimeToPeriapsis.cs" /> |
<Compile Include="Flight\Readouts\ReadoutCategory.cs" /> | <Compile Include="Flight\Readouts\ReadoutCategory.cs" /> |
<Compile Include="Flight\Readouts\ReadoutLibrary.cs" /> | <Compile Include="Flight\Readouts\ReadoutLibrary.cs" /> |
<Compile Include="Flight\Readouts\ReadoutModule.cs" /> | <Compile Include="Flight\Readouts\ReadoutModule.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\TimeToPeriapsis.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\TimeToPeriapsis.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\TimeToApoapsis.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\TimeToApoapsis.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\PeriapsisHeight.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\PeriapsisHeight.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\ApoapsisHeight.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\ApoapsisHeight.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\InterceptAngle.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\InterceptAngle.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\OrbitalPeriod.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\OrbitalPeriod.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\Distance.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\Distance.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\AltitudeSeaLevel.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\AltitudeSeaLevel.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\AngleToRelativeDescendingNode.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\AngleToRelativeDescendingNode.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\AngleToRelativeAscendingNode.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\AngleToRelativeAscendingNode.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\PhaseAngle.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\PhaseAngle.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\RelativeInclination.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\RelativeInclination.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\RendezvousProcessor.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\RendezvousProcessor.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\TargetSelector.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\TargetSelector.cs" /> |
<Compile Include="Flight\Readouts\Surface\AltitudeSeaLevel.cs" /> | <Compile Include="Flight\Readouts\Surface\AltitudeSeaLevel.cs" /> |
<Compile Include="Flight\Readouts\Surface\AltitudeTerrain.cs" /> | <Compile Include="Flight\Readouts\Surface\AltitudeTerrain.cs" /> |
<Compile Include="Flight\Readouts\Surface\ImpactLatitude.cs" /> | <Compile Include="Flight\Readouts\Surface\ImpactLatitude.cs" /> |
<Compile Include="Flight\Readouts\Surface\ImpactAltitude.cs" /> | <Compile Include="Flight\Readouts\Surface\ImpactAltitude.cs" /> |
<Compile Include="Flight\Readouts\Surface\ImpactLongitude.cs" /> | <Compile Include="Flight\Readouts\Surface\ImpactLongitude.cs" /> |
<Compile Include="Flight\Readouts\Surface\ImpactTime.cs" /> | <Compile Include="Flight\Readouts\Surface\ImpactTime.cs" /> |
<Compile Include="Flight\Readouts\Surface\AtmosphericProcessor.cs" /> | <Compile Include="Flight\Readouts\Surface\AtmosphericProcessor.cs" /> |
<Compile Include="Flight\Readouts\Surface\AtmosphericEfficiency.cs" /> | <Compile Include="Flight\Readouts\Surface\AtmosphericEfficiency.cs" /> |
<Compile Include="Flight\Readouts\Surface\GeeForce.cs" /> | <Compile Include="Flight\Readouts\Surface\GeeForce.cs" /> |
<Compile Include="Flight\Readouts\Surface\HorizontalSpeed.cs" /> | <Compile Include="Flight\Readouts\Surface\HorizontalSpeed.cs" /> |
<Compile Include="Flight\Readouts\Surface\ImpactProcessor.cs" /> | <Compile Include="Flight\Readouts\Surface\ImpactProcessor.cs" /> |
<Compile Include="Flight\Readouts\Surface\Latitude.cs" /> | <Compile Include="Flight\Readouts\Surface\Latitude.cs" /> |
<Compile Include="Flight\Readouts\Surface\Longitude.cs" /> | <Compile Include="Flight\Readouts\Surface\Longitude.cs" /> |
<Compile Include="Flight\Readouts\Surface\TerminalVelocity.cs" /> | <Compile Include="Flight\Readouts\Surface\TerminalVelocity.cs" /> |
<Compile Include="Flight\Readouts\Surface\VerticalSpeed.cs" /> | <Compile Include="Flight\Readouts\Surface\VerticalSpeed.cs" /> |
<Compile Include="Flight\Readouts\Vessel\DeltaVStaged.cs" /> | <Compile Include="Flight\Readouts\Vessel\DeltaVStaged.cs" /> |
<Compile Include="Flight\Readouts\Vessel\DeltaVTotal.cs" /> | <Compile Include="Flight\Readouts\Vessel\DeltaVTotal.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Mass.cs" /> | <Compile Include="Flight\Readouts\Vessel\Mass.cs" /> |
<Compile Include="Flight\Readouts\Vessel\Thrust.cs" /> | <Compile Include="Flight\Readouts\Vessel\Thrust.cs" /> |
<Compile Include="Flight\Readouts\Vessel\SpecificImpulse.cs" /> | <Compile Include="Flight\Readouts\Vessel\SpecificImpulse.cs" /> |
<Compile Include="Flight\Readouts\Vessel\ThrustToWeight.cs" /> | <Compile Include="Flight\Readouts\Vessel\ThrustToWeight.cs" /> |
<Compile Include="Flight\Sections\SectionEditor.cs" /> | <Compile Include="Flight\Sections\SectionEditor.cs" /> |
<Compile Include="Flight\Sections\SectionLibrary.cs" /> | <Compile Include="Flight\Sections\SectionLibrary.cs" /> |
<Compile Include="Flight\Sections\SectionModule.cs" /> | <Compile Include="Flight\Sections\SectionModule.cs" /> |
<Compile Include="Flight\Sections\SectionWindow.cs" /> | <Compile Include="Flight\Sections\SectionWindow.cs" /> |
<Compile Include="LogMsg.cs" /> | <Compile Include="LogMsg.cs" /> |
<Compile Include="Properties\AssemblyInfo.cs" /> | <Compile Include="Properties\AssemblyInfo.cs" /> |
<Compile Include="Settings\SettingHandler.cs" /> | <Compile Include="Settings\SettingHandler.cs" /> |
<Compile Include="Settings\SettingItem.cs" /> | <Compile Include="Settings\SettingItem.cs" /> |
<Compile Include="TapeDriveAnimator.cs" /> | <Compile Include="TapeDriveAnimator.cs" /> |
<Compile Include="KeyBinding\KeyBindPopup.cs" /> | |
<Compile Include="UIControls\WindowObject.cs" /> | <Compile Include="UIControls\WindowObject.cs" /> |
<Compile Include="VesselSimulator\AttachNodeSim.cs" /> | <Compile Include="VesselSimulator\AttachNodeSim.cs" /> |
<Compile Include="VesselSimulator\EngineSim.cs" /> | <Compile Include="VesselSimulator\EngineSim.cs" /> |
<Compile Include="Helpers\Pool.cs" /> | <Compile Include="Helpers\Pool.cs" /> |
<Compile Include="VesselSimulator\PartSim.cs" /> | <Compile Include="VesselSimulator\PartSim.cs" /> |
<Compile Include="VesselSimulator\ResourceContainer.cs" /> | <Compile Include="VesselSimulator\ResourceContainer.cs" /> |
<Compile Include="VesselSimulator\SimManager.cs" /> | <Compile Include="VesselSimulator\SimManager.cs" /> |
<Compile Include="VesselSimulator\Simulation.cs" /> | <Compile Include="VesselSimulator\Simulation.cs" /> |
<Compile Include="VesselSimulator\Stage.cs" /> | <Compile Include="VesselSimulator\Stage.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\RelativeRadialVelocity.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\RelativeRadialVelocity.cs" /> |
<Compile Include="Flight\Readouts\Rendezvous\TimeToRendezvous.cs" /> | <Compile Include="Flight\Readouts\Rendezvous\TimeToRendezvous.cs" /> |
</ItemGroup> | </ItemGroup> |
<ItemGroup> | <ItemGroup> |
<Reference Include="Assembly-CSharp"> | <Reference Include="Assembly-CSharp"> |
<HintPath>..\Game\KSP_Data\Managed\Assembly-CSharp.dll</HintPath> | <HintPath>..\..\Game\KSP_Data\Managed\Assembly-CSharp.dll</HintPath> |
<Private>False</Private> | |
</Reference> | |
<Reference Include="Assembly-CSharp-firstpass"> | |
<HintPath>..\..\game\KSP_Data\Managed\Assembly-CSharp-firstpass.dll</HintPath> | |
<Private>False</Private> | |
</Reference> | |
<Reference Include="KSPAssets"> | |
<HintPath>..\..\game\KSP_Data\Managed\KSPAssets.dll</HintPath> | |
<Private>False</Private> | |
</Reference> | |
<Reference Include="KSPCore"> | |
<HintPath>..\..\game\KSP_Data\Managed\KSPCore.dll</HintPath> | |
<Private>False</Private> | |
</Reference> | |
<Reference Include="KSPUtil"> | |
<HintPath>..\..\game\KSP_Data\Managed\KSPUtil.dll</HintPath> | |
<Private>False</Private> | <Private>False</Private> |
</Reference> | </Reference> |
<Reference Include="System"> | <Reference Include="System"> |
<HintPath>..\Game\KSP_Data\Managed\System.dll</HintPath> | <HintPath>..\Game\KSP_Data\Managed\System.dll</HintPath> |
<Private>False</Private> | <Private>False</Private> |
</Reference> | </Reference> |
<Reference Include="System.Xml"> | <Reference Include="System.Xml"> |
<HintPath>..\Game\KSP_Data\Managed\System.Xml.dll</HintPath> | <HintPath>..\Game\KSP_Data\Managed\System.Xml.dll</HintPath> |
<Private>False</Private> | <Private>False</Private> |
</Reference> | </Reference> |
<Reference Include="UnityEngine"> | <Reference Include="UnityEngine"> |
<HintPath>..\Game\KSP_Data\Managed\UnityEngine.dll</HintPath> | <HintPath>..\..\Game\KSP_Data\Managed\UnityEngine.dll</HintPath> |
<Private>False</Private> | |
</Reference> | |
<Reference Include="UnityEngine.UI"> | |
<HintPath>..\..\game\KSP_Data\Managed\UnityEngine.UI.dll</HintPath> | |
<Private>False</Private> | <Private>False</Private> |
</Reference> | </Reference> |
</ItemGroup> | </ItemGroup> |
<ItemGroup /> | <ItemGroup /> |
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
<Target Name="PostBuildMacros"> | <Target Name="PostBuildMacros"> |
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> | <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> |
<Output TaskParameter="Assemblies" ItemName="Targets" /> | <Output TaskParameter="Assemblies" ItemName="Targets" /> |
</GetAssemblyIdentity> | </GetAssemblyIdentity> |
<ItemGroup> | <ItemGroup> |
<VersionNumber Include="@(Targets->'%(Version)')" /> | <VersionNumber Include="@(Targets->'%(Version)')" /> |
</ItemGroup> | </ItemGroup> |
</Target> | </Target> |
<PropertyGroup> | <PropertyGroup> |
<PostBuildEventDependsOn> | <PostBuildEventDependsOn> |
$(PostBuildEventDependsOn); | $(PostBuildEventDependsOn); |
PostBuildMacros; | PostBuildMacros; |
</PostBuildEventDependsOn> | </PostBuildEventDependsOn> |
<PostBuildEvent>xcopy "$(SolutionDir)Output\*" "$(SolutionDir)Game\GameData\*" /E /Y | <PostBuildEvent>xcopy "$(SolutionDir)Output\*" "$(SolutionDir)..\Game\GameData\*" /E /Y |
del "$(SolutionDir)Release\*" /Q | del "$(SolutionDir)Release\*" /Q |
xcopy "$(SolutionDir)Documents\*" "$(SolutionDir)Release\Documents\*" /E /Y | xcopy "$(SolutionDir)Documents\*" "$(SolutionDir)Release\Documents\*" /E /Y |
7z.exe a -tzip -mx3 "$(SolutionDir)Release\$(ProjectName)-@(VersionNumber).zip" "$(SolutionDir)Output\*" | 7z.exe a -tzip -mx3 "$(SolutionDir)Release\$(ProjectName)-@(VersionNumber).zip" "$(SolutionDir)Output\*" |
7z.exe a -tzip -mx3 "$(SolutionDir)Release\$(ProjectName)-@(VersionNumber).zip" "$(SolutionDir)Documents\*"</PostBuildEvent> | 7z.exe a -tzip -mx3 "$(SolutionDir)Release\$(ProjectName)-@(VersionNumber).zip" "$(SolutionDir)Documents\*"</PostBuildEvent> |
</PropertyGroup> | </PropertyGroup> |
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. | <!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
Other similar extension points exist, see Microsoft.Common.targets. | Other similar extension points exist, see Microsoft.Common.targets. |
<Target Name="BeforeBuild"> | <Target Name="BeforeBuild"> |
</Target> | </Target> |
<Target Name="AfterBuild"> | <Target Name="AfterBuild"> |
</Target> | </Target> |
--> | --> |
</Project> | </Project> |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2014 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
using UnityEngine; | |
namespace KerbalEngineer | |
{ | |
public class KeyBinder | |
{ | |
public static KeyCode EditorShowHide { get; set; } | |
public static KeyCode FlightShowHide { get; set; } | |
static KeyBinder() | |
{ | |
EditorShowHide = FlightShowHide = KeyCode.Backslash; | |
} | |
} | |
} |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2015 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
namespace KerbalEngineer.KeyBinding | |
{ | |
using System; | |
using Extensions; | |
using UnityEngine; | |
public class KeyBindPopup : MonoBehaviour | |
{ | |
private const string LOCK_ID = "KER_KeyBindPopup"; | |
private static Rect position = new Rect(Screen.width, Screen.height, 250.0f, 0.0f); | |
private static bool hasCentred; | |
private static KeyBindPopup instance; | |
private readonly Array availableBindings = Enum.GetValues(typeof(KeyCode)); | |
/// <summary> | |
/// Gets the delegate to be invoked when accepted button is clicked. | |
/// </summary> | |
public Action<KeyCode> AcceptClicked { get; private set; } | |
/// <summary> | |
/// Gets the name of the binding to change. | |
/// </summary> | |
public string Name { get; private set; } | |
/// <summary> | |
/// Gets the selected binding. | |
/// </summary> | |
public KeyCode Binding { get; private set; } | |
/// <summary> | |
/// Gets whether a key bind popup is already open. | |
/// </summary> | |
public static bool IsOpen | |
{ | |
get | |
{ | |
return (instance != null); | |
} | |
} | |
/// <summary> | |
/// Gets and sets the input lock state. | |
/// </summary> | |
public bool InputLock | |
{ | |
get | |
{ | |
return InputLockManager.GetControlLock(LOCK_ID) != ControlTypes.None; | |
} | |
set | |
{ | |
if (value) | |
{ | |
InputLockManager.SetControlLock(ControlTypes.All, LOCK_ID); | |
} | |
else | |
{ | |
InputLockManager.SetControlLock(ControlTypes.None, LOCK_ID); | |
} | |
} | |
} | |
/// <summary> | |
/// Shows a key bind popup allowing the user to select a key for binding. | |
/// </summary> | |
public static void Show(string name, KeyCode currentBinding, Action<KeyCode> acceptClicked) | |
{ | |
if (instance == null) | |
{ | |
instance = new GameObject("SelectKeyBind").AddComponent<KeyBindPopup>(); | |
} | |
instance.Name = name; | |
instance.Binding = currentBinding; | |
instance.AcceptClicked = acceptClicked; | |
} | |
/// <summary> | |
/// Handles the accept button click event. | |
/// </summary> | |
public void OnAccept() | |
{ | |
if (AcceptClicked != null) | |
{ | |
AcceptClicked.Invoke(Binding); | |
} | |
Destroy(gameObject); | |
} | |
/// <summary> | |
/// Handles the cancel button click event. | |
/// </summary> | |
public void OnCancel() | |
{ | |
Destroy(gameObject); | |
} | |
/// <summary> | |
/// Called by unity when the component is created. | |
/// </summary> | |
protected virtual void Awake() | |
{ | |
if (instance == null) | |
{ | |
instance = this; | |
} | |
else if (instance != this) | |
{ | |
OnCancel(); | |
} | |
} | |
/// <summary> | |
/// Called by unity when the component is destroyed. | |
/// </summary> | |
protected virtual void OnDestroy() | |
{ | |
InputLock = false; | |
} | |
/// <summary> | |
/// Called by unity each frame to render the GUI. | |
/// </summary> | |
protected virtual void OnGUI() | |
{ | |
position = GUILayout.Window(GetInstanceID(), position, RenderWindow, "Select Key Bind", HighLogic.Skin.window).ClampToScreen(); | |
CentreWindow(); | |
} | |
/// <summary> | |
/// Called by unity every frame. | |
/// </summary> | |
protected virtual void Update() | |
{ | |
CentreWindow(); | |
UpdateBinding(); | |
UpdateInputLock(); | |
} | |
/// <summary> | |
/// Centres the window on the screen. | |
/// </summary> | |
private static void CentreWindow() | |
{ | |
if (hasCentred == false && position.width > 0.0f && position.height > 0.0f) | |
{ | |
hasCentred = true; | |
position.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f); | |
} | |
} | |
/// <summary> | |
/// Renders the window content. | |
/// </summary> | |
private void RenderWindow(int id) | |
{ | |
GUILayout.Label("Press the desired key to change it."); | |
// Binding labels. | |
GUILayout.BeginVertical(HighLogic.Skin.textArea); | |
GUILayout.Label("Key Bind: " + Name); | |
GUILayout.Label("Selected: " + Binding); | |
if (GUILayout.Button("Clear", HighLogic.Skin.button)) | |
{ | |
Binding = KeyCode.None; | |
} | |
GUILayout.EndVertical(); | |
// Window buttons. | |
GUILayout.BeginHorizontal(); | |
if (GUILayout.Button("Cancel", HighLogic.Skin.button)) | |
{ | |
OnCancel(); | |
} | |
if (GUILayout.Button("Accept", HighLogic.Skin.button)) | |
{ | |
OnAccept(); | |
} | |
GUILayout.EndHorizontal(); | |
// Make the window to be draggable. | |
GUI.DragWindow(); | |
} | |
/// <summary> | |
/// Updates the binding selected by the user. | |
/// </summary> | |
private void UpdateBinding() | |
{ | |
for (int i = 0; i < availableBindings.Length; ++i) | |
{ | |
KeyCode keyCode = (KeyCode)availableBindings.GetValue(i); | |
if (keyCode == KeyCode.Mouse0) | |
{ | |
continue; | |
} | |
if (Input.GetKeyDown(keyCode)) | |
{ | |
if (Input.GetKeyDown(keyCode)) | |
{ | |
Binding = keyCode; | |
} | |
} | |
} | |
} | |
/// <summary> | |
/// Updates the input lock. | |
/// </summary> | |
private void UpdateInputLock() | |
{ | |
bool mouseOver = position.MouseIsOver(); | |
bool inputLock = InputLock; | |
if (mouseOver && inputLock == false) | |
{ | |
InputLock = true; | |
} | |
else if (mouseOver == false && inputLock) | |
{ | |
InputLock = false; | |
} | |
} | |
} | |
} |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2015 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
namespace KerbalEngineer.KeyBinding | |
{ | |
using System; | |
using System.IO; | |
using Extensions; | |
using Helpers; | |
using UnityEngine; | |
public class KeyBinder : MonoBehaviour | |
{ | |
private const string LOCK_ID = "KER_KeyBinder"; | |
private static readonly string filePath = Path.Combine(EngineerGlobals.SettingsPath, "KeyBinds.xml"); | |
private static KeyBindingsObject bindings; | |
private static Rect position = new Rect(Screen.width, Screen.height, 500.0f, 0.0f); | |
private static bool hasCentred; | |
static KeyBinder() | |
{ | |
Load(); | |
} | |
/// <summary> | |
/// Gets whether the key binder window is open. | |
/// </summary> | |
public static bool IsOpen { get; private set; } | |
/// <summary> | |
/// Gets and sets the key bindings object. | |
/// </summary> | |
public static KeyBindingsObject Bindings | |
{ | |
get | |
{ | |
if (bindings == null) | |
{ | |
bindings = new KeyBindingsObject(); | |
} | |
return bindings; | |
} | |
private set | |
{ | |
if (value != null) | |
{ | |
bindings = value; | |
} | |
} | |
} | |
/// <summary> | |
/// Gets and sets the editor show/hide binding. | |
/// </summary> | |
public static KeyCode EditorShowHide | |
{ | |
get | |
{ | |
return Bindings.EditorShowHide; | |
} | |
set | |
{ | |
Bindings.EditorShowHide = value; | |
Save(); | |
} | |
} | |
/// <summary> | |
/// Gets and sets the flight show/hide binding. | |
/// </summary> | |
public static KeyCode FlightShowHide | |
{ | |
get | |
{ | |
return Bindings.FlightShowHide; | |
} | |
set | |
{ | |
Bindings.FlightShowHide = value; | |
Save(); | |
} | |
} | |
/// <summary> | |
/// Gets and sets the input lock state. | |
/// </summary> | |
public bool InputLock | |
{ | |
get | |
{ | |
return InputLockManager.GetControlLock(LOCK_ID) != ControlTypes.None; | |
} | |
set | |
{ | |
if (value) | |
{ | |
InputLockManager.SetControlLock(ControlTypes.All, LOCK_ID); | |
} | |
else | |
{ | |
InputLockManager.SetControlLock(ControlTypes.None, LOCK_ID); | |
} | |
} | |
} | |
/// <summary> | |
/// Loads the key bindings from disk. | |
/// </summary> | |
public static void Load() | |
{ | |
Bindings = XmlHelper.LoadObject<KeyBindingsObject>(filePath); | |
} | |
/// <summary> | |
/// Saves the key bindings to disk. | |
/// </summary> | |
public static void Save() | |
{ | |
XmlHelper.SaveObject(filePath, Bindings); | |
} | |
/// <summary> | |
/// Shows the key binding window. | |
/// </summary> | |
public static void Show() | |
{ | |
if (IsOpen) | |
{ | |
return; | |
} | |
new GameObject("KeyBinder").AddComponent<KeyBinder>(); | |
} | |
/// <summary> | |
/// Called by unity when component is created. | |
/// </summary> | |
protected virtual void Awake() | |
{ | |
if (IsOpen) | |
{ | |
Destroy(gameObject); | |
} | |
else | |
{ | |
IsOpen = true; | |
position.height = 0.0f; | |
} | |
} | |
/// <summary> | |
/// Called by unity when component is destroyed. | |
/// </summary> | |
protected virtual void OnDestroy() | |
{ | |
IsOpen = false; | |
InputLock = false; | |
} | |
/// <summary> | |
/// Called by unity to draw the GUI. | |
/// </summary> | |
protected virtual void OnGUI() | |
{ | |
position = GUILayout.Window(GetInstanceID(), position, RenderWindow, "Kerbal Engineer Redux - Key Bindings", HighLogic.Skin.window).ClampToScreen(); | |
CentreWindow(); | |
} | |
/// <summary> | |
/// Called by unity every frame. | |
/// </summary> | |
protected virtual void Update() | |
{ | |
UpdateInputLock(); | |
} | |
/// <summary> | |
/// Renders a key bind option. | |
/// </summary> | |
private static void RenderKeyBind(string name, KeyCode currentBinding, Action<KeyCode> acceptClicked) | |
{ | |
GUILayout.BeginHorizontal(); | |
GUILayout.Label(name); | |
if (GUILayout.Button(currentBinding.ToString(), HighLogic.Skin.button, GUILayout.Width(100.0f))) | |
{ | |
KeyBindPopup.Show(name, currentBinding, acceptClicked); | |
} | |
GUILayout.EndHorizontal(); | |
} | |
/// <summary> | |
/// Centres the window on screen. | |
/// </summary> | |
private void CentreWindow() | |
{ | |
if (hasCentred == false && position.width > 0.0f && position.height > 0.0f) | |
{ | |
hasCentred = true; | |
position.center = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f); | |
} | |
} | |
/// <summary> | |
/// Renders the GUI window contents. | |
/// </summary> | |
private void RenderWindow(int id) | |
{ | |
GUILayout.BeginVertical(HighLogic.Skin.textArea); | |
RenderKeyBind("Editor Show/Hide", EditorShowHide, binding => EditorShowHide = binding); | |
RenderKeyBind("Flight Show/Hide", FlightShowHide, binding => FlightShowHide = binding); | |
GUILayout.EndVertical(); | |
if (GUILayout.Button("Close", HighLogic.Skin.button)) | |
{ | |
Destroy(gameObject); | |
} | |
GUI.DragWindow(); | |
} | |
/// <summary> | |
/// Updates the input lock. | |
/// </summary> | |
private void UpdateInputLock() | |
{ | |
bool mouseOver = position.MouseIsOver(); | |
bool inputLock = InputLock; | |
if (mouseOver && inputLock == false) | |
{ | |
InputLock = true; | |
} | |
else if (mouseOver == false && inputLock) | |
{ | |
InputLock = false; | |
} | |
} | |
} | |
} |
// | |
// Kerbal Engineer Redux | |
// | |
// Copyright (C) 2015 CYBUTEK | |
// | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
// | |
namespace KerbalEngineer.KeyBinding | |
{ | |
using System.Xml.Serialization; | |
using UnityEngine; | |
public class KeyBindingsObject | |
{ | |
public KeyCode EditorShowHide { get; set; } | |
public KeyCode FlightShowHide { get; set; } | |
} | |
} |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
#region Using Directives | #region Using Directives |
using UnityEngine; | using UnityEngine; |
using Random = System.Random; | using Random = System.Random; |
#endregion | #endregion |
namespace KerbalEngineer | namespace KerbalEngineer |
{ | { |
public class TapeDriveAnimator : PartModule | public class TapeDriveAnimator : PartModule |
{ | { |
#region Public Fields | #region Public Fields |
[KSPField] public string Lights1 = ""; | [KSPField] public string Lights1 = ""; |
[KSPField] public float Lights1Speed = 0; | [KSPField] public float Lights1Speed = 0; |
[KSPField] public string Lights2 = ""; | [KSPField] public string Lights2 = ""; |
[KSPField] public float Lights2Speed = 0; | [KSPField] public float Lights2Speed = 0; |
[KSPField] public string Lights3 = ""; | [KSPField] public string Lights3 = ""; |
[KSPField] public float Lights3Speed = 0; | [KSPField] public float Lights3Speed = 0; |
[KSPField] public string Lights4 = ""; | [KSPField] public string Lights4 = ""; |
[KSPField] public float Lights4Speed = 0; | [KSPField] public float Lights4Speed = 0; |
[KSPField] public string Lights5 = ""; | [KSPField] public string Lights5 = ""; |
[KSPField] public float Lights5Speed = 0; | [KSPField] public float Lights5Speed = 0; |
[KSPField] public string Lights6 = ""; | [KSPField] public string Lights6 = ""; |
[KSPField] public float Lights6Speed = 0; | [KSPField] public float Lights6Speed = 0; |
[KSPField] public int MaxReelSpeed = 0; | [KSPField] public int MaxReelSpeed = 0; |
[KSPField] public int MaxRepeatTime = 0; | [KSPField] public int MaxRepeatTime = 0; |
[KSPField] public int MinReelSpeed = 0; | [KSPField] public int MinReelSpeed = 0; |
[KSPField] public int MinRepeatTime = 0; | [KSPField] public int MinRepeatTime = 0; |
[KSPField] public string Reel1 = ""; | [KSPField] public string Reel1 = ""; |
[KSPField] public float Reel1SpeedRatio = 1; | [KSPField] public float Reel1SpeedRatio = 1; |
[KSPField] public string Reel2 = ""; | [KSPField] public string Reel2 = ""; |
[KSPField] public float Reel2SpeedRatio = 1; | [KSPField] public float Reel2SpeedRatio = 1; |
[KSPField] public float RepeatTimeDenominator = 1; | [KSPField] public float RepeatTimeDenominator = 1; |
[KSPField] public float SpeedChangeAmount = 0; | [KSPField] public float SpeedChangeAmount = 0; |
[KSPField] public float SpeedDeadZone = 0; | [KSPField] public float SpeedDeadZone = 0; |
[KSPField] public float SpeedStopZone = 0; | [KSPField] public float SpeedStopZone = 0; |
[KSPField] public bool UseBakedAnimation = false; | [KSPField] public bool UseBakedAnimation = false; |
#endregion | #endregion |
#region Private Fields | #region Private Fields |
private float currentTime; | private float currentTime; |
private float deltaTime; | private float deltaTime; |
private Shader lights1ShaderOff; | private Shader lights1ShaderOff; |
private Transform lights1Transform; | private Transform lights1Transform; |
private Shader lights2ShaderOff; | private Shader lights2ShaderOff; |
private Transform lights2Transform; | private Transform lights2Transform; |
private Shader lights3ShaderOff; | private Shader lights3ShaderOff; |
private Transform lights3Transform; | private Transform lights3Transform; |
private Shader lights4ShaderOff; | private Shader lights4ShaderOff; |
private Transform lights4Transform; | private Transform lights4Transform; |
private Shader lights5ShaderOff; | private Shader lights5ShaderOff; |
private Transform lights5Transform; | private Transform lights5Transform; |
private Shader lights6ShaderOff; | private Shader lights6ShaderOff; |
private Transform lights6Transform; | private Transform lights6Transform; |
private Shader lightsShaderOn; | private Shader lightsShaderOn; |
private Random random; | private Random random; |
private Transform reel1Transform; | private Transform reel1Transform; |
private Transform reel2Transform; | private Transform reel2Transform; |
private float repeatTime; | private float repeatTime; |
private bool sceneIsEditor; | private bool sceneIsEditor; |
private float speed; | private float speed; |
private float targetSpeed; | private float targetSpeed; |
private Renderer renderer; | |
private Light light; | |
#endregion | #endregion |
#region Properties | #region Properties |
private bool isRunning; | private bool isRunning; |
public bool IsRunning | public bool IsRunning |
{ | { |
get { return this.isRunning; } | get { return this.isRunning; } |
set | set |
{ | { |
this.isRunning = value; | this.isRunning = value; |
if (this.isRunning) | if (this.isRunning) |
{ | { |
if (this.UseBakedAnimation) | if (this.UseBakedAnimation) |
{ | { |
this.StartBakedAnimation(); | this.StartBakedAnimation(); |
} | } |
} | } |
else | else |
{ | { |
if (this.UseBakedAnimation) | if (this.UseBakedAnimation) |
{ | { |
this.StopBakedAnimation(); | this.StopBakedAnimation(); |
} | } |
} | } |
} | } |
} | } |
#endregion | #endregion |
#region Initialisation | #region Initialisation |
public override void OnStart(StartState state) | public override void OnStart(StartState state) |
{ | { |
renderer = GetComponent<Renderer>(); | |
this.random = new Random(); | this.random = new Random(); |
this.StopBakedAnimation(); | this.StopBakedAnimation(); |
this.IsRunning = false; | this.IsRunning = false; |
if (HighLogic.LoadedSceneIsEditor) | if (HighLogic.LoadedSceneIsEditor) |
{ | { |
this.part.OnEditorAttach += this.OnEditorAttach; | this.part.OnEditorAttach += this.OnEditorAttach; |
this.part.OnEditorDetach += this.OnEditorDetach; | this.part.OnEditorDetach += this.OnEditorDetach; |
this.sceneIsEditor = true; | this.sceneIsEditor = true; |
if (this.part.parent != null) | if (this.part.parent != null) |
{ | { |
this.IsRunning = true; | this.IsRunning = true; |
} | } |
} | } |
else if (HighLogic.LoadedSceneIsFlight) | else if (HighLogic.LoadedSceneIsFlight) |
{ | { |
this.IsRunning = true; | this.IsRunning = true; |
} | } |
if (!this.UseBakedAnimation) | if (!this.UseBakedAnimation) |
{ | { |
this.InitialiseReels(); | this.InitialiseReels(); |
this.InitialiseLights(); | this.InitialiseLights(); |
} | } |
} | } |
private void InitialiseReels() | private void InitialiseReels() |
{ | { |
if (this.Reel1 != "") | if (this.Reel1 != "") |
{ | { |
this.reel1Transform = this.part.FindModelTransform(this.Reel1); | this.reel1Transform = this.part.FindModelTransform(this.Reel1); |
} | } |
if (this.Reel2 != "") | if (this.Reel2 != "") |
{ | { |
this.reel2Transform = this.part.FindModelTransform(this.Reel2); | this.reel2Transform = this.part.FindModelTransform(this.Reel2); |
} | } |
} | } |
private void InitialiseLights() | private void InitialiseLights() |
{ | { |
if (this.Lights1 != "") | if (this.Lights1 != "") |
{ | { |
this.lights1Transform = this.part.FindModelTransform(this.Lights1); | this.lights1Transform = this.part.FindModelTransform(this.Lights1); |
this.lights1ShaderOff = this.lights1Transform.renderer.material.shader; | this.lights1ShaderOff = renderer.material.shader; |
} | } |
if (this.Lights2 != "") | if (this.Lights2 != "") |
{ | { |
this.lights2Transform = this.part.FindModelTransform(this.Lights2); | this.lights2Transform = this.part.FindModelTransform(this.Lights2); |
this.lights2ShaderOff = this.lights2Transform.renderer.material.shader; | this.lights2ShaderOff = renderer.material.shader; |
} | } |
if (this.Lights3 != "") | if (this.Lights3 != "") |
{ | { |
this.lights3Transform = this.part.FindModelTransform(this.Lights3); | this.lights3Transform = this.part.FindModelTransform(this.Lights3); |
this.lights3ShaderOff = this.lights3Transform.renderer.material.shader; | this.lights3ShaderOff = renderer.material.shader; |
} | } |
if (this.Lights4 != "") | if (this.Lights4 != "") |
{ | { |
this.lights4Transform = this.part.FindModelTransform(this.Lights4); | this.lights4Transform = this.part.FindModelTransform(this.Lights4); |
this.lights4ShaderOff = this.lights4Transform.renderer.material.shader; | this.lights4ShaderOff = renderer.material.shader; |
} | } |
if (this.Lights5 != "") | if (this.Lights5 != "") |
{ | { |
this.lights5Transform = this.part.FindModelTransform(this.Lights5); | this.lights5Transform = this.part.FindModelTransform(this.Lights5); |
this.lights5ShaderOff = this.lights5Transform.renderer.material.shader; | this.lights5ShaderOff = renderer.material.shader; |
} | } |
if (this.Lights6 != "") | if (this.Lights6 != "") |
{ | { |
this.lights6Transform = this.part.FindModelTransform(this.Lights6); | this.lights6Transform = this.part.FindModelTransform(this.Lights6); |
this.lights6ShaderOff = this.lights6Transform.renderer.material.shader; | this.lights6ShaderOff = renderer.material.shader; |
} | } |
this.lightsShaderOn = Shader.Find("Unlit/Texture"); | this.lightsShaderOn = Shader.Find("Unlit/Texture"); |
} | } |
#endregion | #endregion |
#region Updating | #region Updating |
public override void OnUpdate() | public override void OnUpdate() |
{ | { |
if (!this.UseBakedAnimation) | if (!this.UseBakedAnimation) |
{ | { |
this.deltaTime = this.sceneIsEditor ? Time.deltaTime : TimeWarp.deltaTime; | this.deltaTime = this.sceneIsEditor ? Time.deltaTime : TimeWarp.deltaTime; |
if (TimeWarp.CurrentRate != 1.0f && TimeWarp.WarpMode != TimeWarp.Modes.LOW) | if (TimeWarp.CurrentRate != 1.0f && TimeWarp.WarpMode != TimeWarp.Modes.LOW) |
{ | { |
return; | return; |
} | } |
if (this.IsRunning) | if (this.IsRunning) |
{ | { |
this.UpdateTimerCycle(); | this.UpdateTimerCycle(); |
this.UpdateSpeed(); | this.UpdateSpeed(); |
this.UpdateReels(); | this.UpdateReels(); |
this.UpdateLights(); | this.UpdateLights(); |
} | } |
else | else |
{ | { |
this.targetSpeed = 0; | this.targetSpeed = 0; |
if (this.speed != 0) | if (this.speed != 0) |
{ | { |
this.UpdateSpeed(); | this.UpdateSpeed(); |
this.UpdateReels(); | this.UpdateReels(); |
this.UpdateLights(); | this.UpdateLights(); |
} | } |
} | } |
} | } |
} | } |
private void Update() | private void Update() |
{ | { |
if (this.sceneIsEditor) | if (this.sceneIsEditor) |
{ | { |
this.OnUpdate(); | this.OnUpdate(); |
} | } |
} | } |
private void OnEditorAttach() | private void OnEditorAttach() |
{ | { |
this.IsRunning = true; | this.IsRunning = true; |
} | } |
private void OnEditorDetach() | private void OnEditorDetach() |
{ | { |
this.IsRunning = false; | this.IsRunning = false; |
} | } |
private void StopBakedAnimation() | private void StopBakedAnimation() |
{ | { |
foreach (var animator in this.part.FindModelAnimators()) | foreach (var animator in this.part.FindModelAnimators()) |
{ | { |
animator.Stop(); | animator.Stop(); |
} | } |
} | } |
private void StartBakedAnimation() | private void StartBakedAnimation() |
{ | { |
foreach (var animator in this.part.FindModelAnimators()) | foreach (var animator in this.part.FindModelAnimators()) |
{ | { |
animator.Play(); | animator.Play(); |
} | } |
} | } |
private void UpdateTimerCycle() | private void UpdateTimerCycle() |
{ | { |
this.currentTime += this.deltaTime; | this.currentTime += this.deltaTime; |
if (this.currentTime >= this.repeatTime) | if (this.currentTime >= this.repeatTime) |
{ | { |
this.targetSpeed = this.random.Next(this.MinReelSpeed, this.MaxReelSpeed); | this.targetSpeed = this.random.Next(this.MinReelSpeed, this.MaxReelSpeed); |
if (this.targetSpeed > -this.SpeedStopZone && this.targetSpeed < this.SpeedStopZone) | if (this.targetSpeed > -this.SpeedStopZone && this.targetSpeed < this.SpeedStopZone) |
{ | { |
this.targetSpeed = 0; | this.targetSpeed = 0; |
} | } |
this.repeatTime = this.random.Next(this.MinRepeatTime, this.MaxRepeatTime); | this.repeatTime = this.random.Next(this.MinRepeatTime, this.MaxRepeatTime); |
if (this.RepeatTimeDenominator != 0) | if (this.RepeatTimeDenominator != 0) |
{ | { |
this.repeatTime /= this.RepeatTimeDenominator; | this.repeatTime /= this.RepeatTimeDenominator; |
} | } |
this.currentTime -= this.repeatTime; | this.currentTime -= this.repeatTime; |
} | } |
} | } |
private void UpdateSpeed() | private void UpdateSpeed() |
{ | { |
if (this.speed < this.targetSpeed) | if (this.speed < this.targetSpeed) |
{ | { |
if (this.speed < this.targetSpeed - this.SpeedDeadZone) | if (this.speed < this.targetSpeed - this.SpeedDeadZone) |
{ | { |
this.speed += this.SpeedChangeAmount * this.deltaTime; | this.speed += this.SpeedChangeAmount * this.deltaTime; |
} | } |
else | else |
{ | { |
this.speed = this.targetSpeed; | this.speed = this.targetSpeed; |
} | } |
} | } |
else if (this.speed > this.targetSpeed) | else if (this.speed > this.targetSpeed) |
{ | { |
if (this.speed > this.targetSpeed + this.SpeedDeadZone) | if (this.speed > this.targetSpeed + this.SpeedDeadZone) |
{ | { |
this.speed -= this.SpeedChangeAmount * this.deltaTime; | this.speed -= this.SpeedChangeAmount * this.deltaTime; |
} | } |
else | else |
{ | { |
this.speed = this.targetSpeed; | this.speed = this.targetSpeed; |
} | } |
} | } |
} | } |
private void UpdateReels() | private void UpdateReels() |
{ | { |
if (this.reel1Transform != null && this.speed != 0) | if (this.reel1Transform != null && this.speed != 0) |
{ | { |
this.reel1Transform.transform.Rotate(Vector3.right, this.speed * this.Reel1SpeedRatio); | this.reel1Transform.transform.Rotate(Vector3.right, this.speed * this.Reel1SpeedRatio); |
} | } |
if (this.reel2Transform != null && this.speed != 0) | if (this.reel2Transform != null && this.speed != 0) |
{ | { |
this.reel2Transform.transform.Rotate(Vector3.right, this.speed * this.Reel2SpeedRatio); | this.reel2Transform.transform.Rotate(Vector3.right, this.speed * this.Reel2SpeedRatio); |
} | } |
} | } |
private void UpdateLights() | private void UpdateLights() |
{ | { |
if (this.lights1Transform != null) | if (this.lights1Transform != null) |
{ | { |
this.UpdateLightTransform(this.lights1Transform, this.lightsShaderOn, this.lights1ShaderOff, this.Lights1Speed); | this.UpdateLightTransform(this.lights1Transform, this.lightsShaderOn, this.lights1ShaderOff, this.Lights1Speed); |
} | } |
if (this.lights2Transform != null) | if (this.lights2Transform != null) |
{ | { |
this.UpdateLightTransform(this.lights2Transform, this.lightsShaderOn, this.lights2ShaderOff, this.Lights2Speed); | this.UpdateLightTransform(this.lights2Transform, this.lightsShaderOn, this.lights2ShaderOff, this.Lights2Speed); |
} | } |
if (this.lights3Transform != null) | if (this.lights3Transform != null) |
{ | { |
this.UpdateLightTransform(this.lights3Transform, this.lightsShaderOn, this.lights3ShaderOff, this.Lights3Speed); | this.UpdateLightTransform(this.lights3Transform, this.lightsShaderOn, this.lights3ShaderOff, this.Lights3Speed); |
} | } |
if (this.lights4Transform != null) | if (this.lights4Transform != null) |
{ | { |
this.UpdateLightTransform(this.lights4Transform, this.lightsShaderOn, this.lights4ShaderOff, this.Lights4Speed); | this.UpdateLightTransform(this.lights4Transform, this.lightsShaderOn, this.lights4ShaderOff, this.Lights4Speed); |
} | } |
if (this.lights5Transform != null) | if (this.lights5Transform != null) |
{ | { |
this.UpdateLightTransform(this.lights5Transform, this.lightsShaderOn, this.lights5ShaderOff, this.Lights5Speed); | this.UpdateLightTransform(this.lights5Transform, this.lightsShaderOn, this.lights5ShaderOff, this.Lights5Speed); |
} | } |
if (this.lights6Transform != null) | if (this.lights6Transform != null) |
{ | { |
this.UpdateLightTransform(this.lights6Transform, this.lightsShaderOn, this.lights6ShaderOff, this.Lights6Speed); | this.UpdateLightTransform(this.lights6Transform, this.lightsShaderOn, this.lights6ShaderOff, this.Lights6Speed); |
} | } |
} | } |
private void UpdateLightTransform(Component lights, Shader on, Shader off, float targetSpeed) | private void UpdateLightTransform(Component lights, Shader on, Shader off, float targetSpeed) |
{ | { |
bool lightsOn; | bool lightsOn; |
if (targetSpeed > 0) | if (targetSpeed > 0) |
{ | { |
lightsOn = (this.speed > targetSpeed); | lightsOn = (this.speed > targetSpeed); |
} | } |
else if (targetSpeed < 0) | else if (targetSpeed < 0) |
{ | { |
lightsOn = (this.speed < targetSpeed); | lightsOn = (this.speed < targetSpeed); |
} | } |
else | else |
{ | { |
lightsOn = (this.speed == 0); | lightsOn = (this.speed == 0); |
} | } |
lights.renderer.material.shader = lightsOn ? @on : off; | lights.GetComponent<Renderer>().material.shader = lightsOn ? @on : off; |
} | } |
#endregion | #endregion |
} | } |
} | } |
// | // |
// Kerbal Engineer Redux | // Kerbal Engineer Redux |
// | // |
// Copyright (C) 2014 CYBUTEK | // Copyright (C) 2014 CYBUTEK |
// | // |
// This program is free software: you can redistribute it and/or modify | // This program is free software: you can redistribute it and/or modify |
// it under the terms of the GNU General Public License as published by | // it under the terms of the GNU General Public License as published by |
// the Free Software Foundation, either version 3 of the License, or | // the Free Software Foundation, either version 3 of the License, or |
// (at your option) any later version. | // (at your option) any later version. |
// | // |
// This program is distributed in the hope that it will be useful, | // This program is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
// GNU General Public License for more details. | // GNU General Public License for more details. |
// | // |
// You should have received a copy of the GNU General Public License | // You should have received a copy of the GNU General Public License |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
// | // |
namespace KerbalEngineer.VesselSimulator | namespace KerbalEngineer.VesselSimulator |
{ | { |
using System; | using System; |
using System.Collections.Generic; | using System.Collections.Generic; |
using System.Text; | using System.Text; |
using Editor; | using Editor; |
using Helpers; | using Helpers; |
using UnityEngine; | using UnityEngine; |
public class EngineSim | public class EngineSim |
{ | { |
private static readonly Pool<EngineSim> pool = new Pool<EngineSim>(Create, Reset); | private static readonly Pool<EngineSim> pool = new Pool<EngineSim>(Create, Reset); |
private readonly ResourceContainer resourceConsumptions = new ResourceContainer(); | private readonly ResourceContainer resourceConsumptions = new ResourceContainer(); |
private readonly ResourceContainer resourceFlowModes = new ResourceContainer(); | private readonly ResourceContainer resourceFlowModes = new ResourceContainer(); |
public double actualThrust = 0; | public double actualThrust = 0; |
public bool isActive = false; | public bool isActive = false; |
public double isp = 0; | public double isp = 0; |
public PartSim partSim; | public PartSim partSim; |
public List<AppliedForce> appliedForces = new List<AppliedForce>(); | public List<AppliedForce> appliedForces = new List<AppliedForce>(); |
public float maxMach; | public float maxMach; |
public double thrust = 0; | public double thrust = 0; |
// Add thrust vector to account for directional losses | // Add thrust vector to account for directional losses |
public Vector3 thrustVec; | public Vector3 thrustVec; |
private static EngineSim Create() | private static EngineSim Create() |
{ | { |
return new EngineSim(); | return new EngineSim(); |
} | } |
private static void Reset(EngineSim engineSim) | private static void Reset(EngineSim engineSim) |
{ | { |
engineSim.resourceConsumptions.Reset(); | engineSim.resourceConsumptions.Reset(); |
engineSim.resourceFlowModes.Reset(); | engineSim.resourceFlowModes.Reset(); |
engineSim.actualThrust = 0; | engineSim.actualThrust = 0; |
engineSim.isActive = false; | engineSim.isActive = false; |
engineSim.isp = 0; | engineSim.isp = 0; |
for (int i = 0; i < engineSim.appliedForces.Count; i++) | for (int i = 0; i < engineSim.appliedForces.Count; i++) |
{ | { |
engineSim.appliedForces[i].Release(); | engineSim.appliedForces[i].Release(); |
} | } |
engineSim.appliedForces.Clear(); | engineSim.appliedForces.Clear(); |
engineSim.thrust = 0; | engineSim.thrust = 0; |
engineSim.maxMach = 0f; | engineSim.maxMach = 0f; |
} | } |
public void Release() | public void Release() |
{ | { |
pool.Release(this); | pool.Release(this); |
} | } |
public static EngineSim New(PartSim theEngine, | public static EngineSim New(PartSim theEngine, |
double atmosphere, | double atmosphere, |
float machNumber, | float machNumber, |
float maxFuelFlow, | float maxFuelFlow, |
float minFuelFlow, | float minFuelFlow, |
float thrustPercentage, | float thrustPercentage, |
Vector3 vecThrust, | Vector3 vecThrust, |
FloatCurve atmosphereCurve, | FloatCurve atmosphereCurve, |
bool atmChangeFlow, | bool atmChangeFlow, |
FloatCurve atmCurve, | FloatCurve atmCurve, |
FloatCurve velCurve, | FloatCurve velCurve, |
float currentThrottle, | float currentThrottle, |
float IspG, | float IspG, |
bool throttleLocked, | bool throttleLocked, |
List<Propellant> propellants, | List<Propellant> propellants, |
bool active, | bool active, |
float resultingThrust, | float resultingThrust, |
List<Transform> thrustTransforms, | List<Transform> thrustTransforms, |
LogMsg log) | LogMsg log) |
{ | { |
EngineSim engineSim = pool.Borrow(); | EngineSim engineSim = pool.Borrow(); |
engineSim.isp = 0.0; | engineSim.isp = 0.0; |
engineSim.maxMach = 0.0f; | engineSim.maxMach = 0.0f; |
engineSim.actualThrust = 0.0; | engineSim.actualThrust = 0.0; |
engineSim.partSim = theEngine; | engineSim.partSim = theEngine; |
engineSim.isActive = active; | engineSim.isActive = active; |
engineSim.thrustVec = vecThrust; | engineSim.thrustVec = vecThrust; |
engineSim.resourceConsumptions.Reset(); | engineSim.resourceConsumptions.Reset(); |
engineSim.resourceFlowModes.Reset(); | engineSim.resourceFlowModes.Reset(); |
engineSim.appliedForces.Clear(); | engineSim.appliedForces.Clear(); |
double flowRate = 0.0; | double flowRate = 0.0; |
if (engineSim.partSim.hasVessel) | if (engineSim.partSim.hasVessel) |
{ | { |
if (log != null) log.buf.AppendLine("hasVessel is true"); | if (log != null) log.buf.AppendLine("hasVessel is true"); |
float flowModifier = GetFlowModifier(atmChangeFlow, atmCurve, engineSim.partSim.part.atmDensity, velCurve, machNumber, ref engineSim.maxMach); | float flowModifier = GetFlowModifier(atmChangeFlow, atmCurve, engineSim.partSim.part.atmDensity, velCurve, machNumber, ref engineSim.maxMach); |
engineSim.isp = atmosphereCurve.Evaluate((float)atmosphere); | engineSim.isp = atmosphereCurve.Evaluate((float)atmosphere); |
engineSim.thrust = GetThrust(Mathf.Lerp(minFuelFlow, maxFuelFlow, GetThrustPercent(thrustPercentage)) * flowModifier, engineSim.isp); | engineSim.thrust = GetThrust(Mathf.Lerp(minFuelFlow, maxFuelFlow, GetThrustPercent(thrustPercentage)) * flowModifier, engineSim.isp); |
engineSim.actualThrust = engineSim.isActive ? resultingThrust : 0.0; | engineSim.actualThrust = engineSim.isActive ? resultingThrust : 0.0; |
if (log != null) | if (log != null) |
{ | { |
log.buf.AppendFormat("flowMod = {0:g6}\n", flowModifier); | log.buf.AppendFormat("flowMod = {0:g6}\n", flowModifier); |
log.buf.AppendFormat("isp = {0:g6}\n", engineSim.isp); | log.buf.AppendFormat("isp = {0:g6}\n", engineSim.isp); |
log.buf.AppendFormat("thrust = {0:g6}\n", engineSim.thrust); | log.buf.AppendFormat("thrust = {0:g6}\n", engineSim.thrust); |
log.buf.AppendFormat("actual = {0:g6}\n", engineSim.actualThrust); | log.buf.AppendFormat("actual = {0:g6}\n", engineSim.actualThrust); |
} | } |
if (throttleLocked) | if (throttleLocked) |
{ | { |
if (log != null) log.buf.AppendLine("throttleLocked is true, using thrust for flowRate"); | if (log != null) log.buf.AppendLine("throttleLocked is true, using thrust for flowRate"); |
flowRate = GetFlowRate(engineSim.thrust, engineSim.isp); | flowRate = GetFlowRate(engineSim.thrust, engineSim.isp); |
} | } |
else | else |
{ | { |
if (currentThrottle > 0.0f && engineSim.partSim.isLanded == false) | if (currentThrottle > 0.0f && engineSim.partSim.isLanded == false) |
{ | { |
if (log != null) log.buf.AppendLine("throttled up and not landed, using actualThrust for flowRate"); | if (log != null) log.buf.AppendLine("throttled up and not landed, using actualThrust for flowRate"); |
flowRate = GetFlowRate(engineSim.actualThrust, engineSim.isp); | flowRate = GetFlowRate(engineSim.actualThrust, engineSim.isp); |
} | } |
else | else |
{ | { |
if (log != null) log.buf.AppendLine("throttled down or landed, using thrust for flowRate"); | if (log != null) log.buf.AppendLine("throttled down or landed, using thrust for flowRate"); |
flowRate = GetFlowRate(engineSim.thrust, engineSim.isp); | flowRate = GetFlowRate(engineSim.thrust, engineSim.isp); |
} | } |
} | } |
} | } |
else | else |
{ | { |
if (log != null) log.buf.AppendLine("hasVessel is false"); | if (log != null) log.buf.AppendLine("hasVessel is false"); |
float flowModifier = GetFlowModifier(atmChangeFlow, atmCurve, CelestialBodies.SelectedBody.GetDensity(BuildAdvanced.Altitude), velCurve, machNumber, ref engineSim.maxMach); | float flowModifier = GetFlowModifier(atmChangeFlow, atmCurve, CelestialBodies.SelectedBody.GetDensity(BuildAdvanced.Altitude), velCurve, machNumber, ref engineSim.maxMach); |
engineSim.isp = atmosphereCurve.Evaluate((float)atmosphere); | engineSim.isp = atmosphereCurve.Evaluate((float)atmosphere); |
engineSim.thrust = GetThrust(Mathf.Lerp(minFuelFlow, maxFuelFlow, GetThrustPercent(thrustPercentage)) * flowModifier, engineSim.isp); | engineSim.thrust = GetThrust(Mathf.Lerp(minFuelFlow, maxFuelFlow, GetThrustPercent(thrustPercentage)) * flowModifier, engineSim.isp); |
engineSim.actualThrust = 0d; | engineSim.actualThrust = 0d; |
if (log != null) | if (log != null) |
{ | { |
log.buf.AppendFormat("flowMod = {0:g6}\n", flowModifier); | log.buf.AppendFormat("flowMod = {0:g6}\n", flowModifier); |
log.buf.AppendFormat("isp = {0:g6}\n", engineSim.isp); | log.buf.AppendFormat("isp = {0:g6}\n", engineSim.isp); |
log.buf.AppendFormat("thrust = {0:g6}\n", engineSim.thrust); | log.buf.AppendFormat("thrust = {0:g6}\n", engineSim.thrust); |
log.buf.AppendFormat("actual = {0:g6}\n", engineSim.actualThrust); | log.buf.AppendFormat("actual = {0:g6}\n", engineSim.actualThrust); |
} | } |
if (log != null) log.buf.AppendLine("no vessel, using thrust for flowRate"); | if (log != null) log.buf.AppendLine("no vessel, using thrust for flowRate"); |
flowRate = GetFlowRate(engineSim.thrust, engineSim.isp); | flowRate = GetFlowRate(engineSim.thrust, engineSim.isp); |
} | } |
if (log != null) log.buf.AppendFormat("flowRate = {0:g6}\n", flowRate); | if (log != null) log.buf.AppendFormat("flowRate = {0:g6}\n", flowRate); |
float flowMass = 0f; | float flowMass = 0f; |
for (int i = 0; i < propellants.Count; ++i) | for (int i = 0; i < propellants.Count; ++i) |
{ | { |
Propellant propellant = propellants[i]; | Propellant propellant = propellants[i]; |
if (!propellant.ignoreForIsp) | if (!propellant.ignoreForIsp) |
flowMass += propellant.ratio * ResourceContainer.GetResourceDensity(propellant.id); | flowMass += propellant.ratio * ResourceContainer.GetResourceDensity(propellant.id); |
} | } |
if (log != null) log.buf.AppendFormat("flowMass = {0:g6}\n", flowMass); | if (log != null) log.buf.AppendFormat("flowMass = {0:g6}\n", flowMass); |
for (int i = 0; i < propellants.Count; ++i) | for (int i = 0; i < propellants.Count; ++i) |
{ | { |
Propellant propellant = propellants[i]; | Propellant propellant = propellants[i]; |
if (propellant.name == "ElectricCharge" || propellant.name == "IntakeAir") | if (propellant.name == "ElectricCharge" || propellant.name == "IntakeAir") |
{ | { |
continue; | continue; |
} | } |
double consumptionRate = propellant.ratio * flowRate / flowMass; | double consumptionRate = propellant.ratio * flowRate / flowMass; |
if (log != null) log.buf.AppendFormat( | if (log != null) log.buf.AppendFormat( |
"Add consumption({0}, {1}:{2:d}) = {3:g6}\n", | "Add consumption({0}, {1}:{2:d}) = {3:g6}\n", |
ResourceContainer.GetResourceName(propellant.id), | ResourceContainer.GetResourceName(propellant.id), |
theEngine.name, | theEngine.name, |
theEngine.partId, | theEngine.partId, |
consumptionRate); | consumptionRate); |
engineSim.resourceConsumptions.Add(propellant.id, consumptionRate); | engineSim.resourceConsumptions.Add(propellant.id, consumptionRate); |
engineSim.resourceFlowModes.Add(propellant.id, (double)propellant.GetFlowMode()); | engineSim.resourceFlowModes.Add(propellant.id, (double)propellant.GetFlowMode()); |
} | } |
double thrustPerThrustTransform = engineSim.thrust / thrustTransforms.Count; | double thrustPerThrustTransform = engineSim.thrust / thrustTransforms.Count; |
for (int i = 0; i < thrustTransforms.Count; i++) | for (int i = 0; i < thrustTransforms.Count; i++) |
{ | { |
Transform thrustTransform = thrustTransforms[i]; | Transform thrustTransform = thrustTransforms[i]; |
Vector3d direction = thrustTransform.forward.normalized; | Vector3d direction = thrustTransform.forward.normalized; |
Vector3d position = thrustTransform.position; | Vector3d position = thrustTransform.position; |
AppliedForce appliedForce = AppliedForce.New(direction * thrustPerThrustTransform, position); | AppliedForce appliedForce = AppliedForce.New(direction * thrustPerThrustTransform, position); |
engineSim.appliedForces.Add(appliedForce); | engineSim.appliedForces.Add(appliedForce); |
} | } |
return engineSim; | return engineSim; |
} | } |
public ResourceContainer ResourceConsumptions | public ResourceContainer ResourceConsumptions |
{ | { |
get | get |
{ | { |
return resourceConsumptions; | return resourceConsumptions; |
} | } |
} | } |
public static double GetExhaustVelocity(double isp) | public static double GetExhaustVelocity(double isp) |
{ | { |
return isp * Units.GRAVITY; | return isp * Units.GRAVITY; |
} | } |
public static float GetFlowModifier(bool atmChangeFlow, FloatCurve atmCurve, double atmDensity, FloatCurve velCurve, float machNumber, ref float maxMach) | public static float GetFlowModifier(bool atmChangeFlow, FloatCurve atmCurve, double atmDensity, FloatCurve velCurve, float machNumber, ref float maxMach) |
{ | { |
float flowModifier = 1.0f; | float flowModifier = 1.0f; |
if (atmChangeFlow) | if (atmChangeFlow) |
{ | { |
flowModifier = (float)(atmDensity / 1.225); | flowModifier = (float)(atmDensity / 1.225); |
if (atmCurve != null) | if (atmCurve != null) |
{ | { |
flowModifier = atmCurve.Evaluate(flowModifier); | flowModifier = atmCurve.Evaluate(flowModifier); |
} | } |
} | } |
if (velCurve != null) | if (velCurve != null) |
{ | { |
flowModifier = flowModifier * velCurve.Evaluate(machNumber); | flowModifier = flowModifier * velCurve.Evaluate(machNumber); |
maxMach = velCurve.maxTime; | maxMach = velCurve.maxTime; |
} | } |
if (flowModifier < float.Epsilon) | if (flowModifier < float.Epsilon) |
{ | { |
flowModifier = float.Epsilon; | flowModifier = float.Epsilon; |
} | } |
return flowModifier; | return flowModifier; |
} | } |
public static double GetFlowRate(double thrust, double isp) | public static double GetFlowRate(double thrust, double isp) |
{ | { |
return thrust / GetExhaustVelocity(isp); | return thrust / GetExhaustVelocity(isp); |
} | } |
public static float GetThrottlePercent(float currentThrottle, float thrustPercentage) | public static float GetThrottlePercent(float currentThrottle, float thrustPercentage) |
{ | { |
return currentThrottle * GetThrustPercent(thrustPercentage); | return currentThrottle * GetThrustPercent(thrustPercentage); |
} | } |
public static double GetThrust(double flowRate, double isp) | public static double GetThrust(double flowRate, double isp) |
{ | { |
return flowRate * GetExhaustVelocity(isp); | return flowRate * GetExhaustVelocity(isp); |
} | } |
public static float GetThrustPercent(float thrustPercentage) | public static float GetThrustPercent(float thrustPercentage) |
{ | { |
return thrustPercentage * 0.01f; | return thrustPercentage * 0.01f; |
} | } |
public void DumpEngineToBuffer(StringBuilder buffer, String prefix) | public void DumpEngineToBuffer(StringBuilder buffer, String prefix) |
{ | { |
buffer.Append(prefix); | buffer.Append(prefix); |
buffer.AppendFormat("[thrust = {0:g6}, actual = {1:g6}, isp = {2:g6}\n", thrust, actualThrust, isp); | buffer.AppendFormat("[thrust = {0:g6}, actual = {1:g6}, isp = {2:g6}\n", thrust, actualThrust, isp); |
} | } |
// A dictionary to hold a set of parts for each resource | // A dictionary to hold a set of parts for each resource |
Dictionary<int, HashSet<PartSim>> sourcePartSets = new Dictionary<int, HashSet<PartSim>>(); | Dictionary<int, HashSet<PartSim>> sourcePartSets = new Dictionary<int, HashSet<PartSim>>(); |
Dictionary<int, HashSet<PartSim>> stagePartSets = new Dictionary<int, HashSet<PartSim>>(); | Dictionary<int, HashSet<PartSim>> stagePartSets = new Dictionary<int, HashSet<PartSim>>(); |
HashSet<PartSim> visited = new HashSet<PartSim>(); | HashSet<PartSim> visited = new HashSet<PartSim>(); |
public void DumpSourcePartSets(String msg) | public void DumpSourcePartSets(String msg) |
{ | { |
MonoBehaviour.print("DumpSourcePartSets " + msg); | MonoBehaviour.print("DumpSourcePartSets " + msg); |
foreach (int type in sourcePartSets.Keys) | foreach (int type in sourcePartSets.Keys) |
{ | { |
MonoBehaviour.print("SourcePartSet for " + ResourceContainer.GetResourceName(type)); | MonoBehaviour.print("SourcePartSet for " + ResourceContainer.GetResourceName(type)); |
HashSet<PartSim> sourcePartSet = sourcePartSets[type]; | HashSet<PartSim> sourcePartSet = sourcePartSets[type]; |
if (sourcePartSet.Count > 0) | if (sourcePartSet.Count > 0) |
{ | { |
foreach (PartSim partSim in sourcePartSet) | foreach (PartSim partSim in sourcePartSet) |
{ | { |
MonoBehaviour.print("Part " + partSim.name + ":" + partSim.partId); | MonoBehaviour.print("Part " + partSim.name + ":" + partSim.partId); |
} | } |
} | } |
else | else |
{ | { |
MonoBehaviour.print("No parts"); | MonoBehaviour.print("No parts"); |
} | } |
} | } |
} | } |
public bool SetResourceDrains(List<PartSim> allParts, List<PartSim> allFuelLines, HashSet<PartSim> drainingParts) | public bool SetResourceDrains(List<PartSim> allParts, List<PartSim> allFuelLines, HashSet<PartSim> drainingParts) |
{ | { |
LogMsg log = null; | LogMsg log = null; |
//DumpSourcePartSets("before clear"); | //DumpSourcePartSets("before clear"); |
foreach (HashSet<PartSim> sourcePartSet in sourcePartSets.Values) | foreach (HashSet<PartSim> sourcePartSet in sourcePartSets.Values) |
{ | { |
sourcePartSet.Clear(); | sourcePartSet.Clear(); |
} | } |
//DumpSourcePartSets("after clear"); | //DumpSourcePartSets("after clear"); |
for (int index = 0; index < this.resourceConsumptions.Types.Count; index++) | for (int index = 0; index < this.resourceConsumptions.Types.Count; index++) |
{ | { |
int type = this.resourceConsumptions.Types[index]; | int type = this.resourceConsumptions.Types[index]; |
HashSet<PartSim> sourcePartSet; | HashSet<PartSim> sourcePartSet; |
if (!sourcePartSets.TryGetValue(type, out sourcePartSet)) | if (!sourcePartSets.TryGetValue(type, out sourcePartSet)) |
{ | { |
sourcePartSet = new HashSet<PartSim>(); | sourcePartSet = new HashSet<PartSim>(); |
sourcePartSets.Add(type, sourcePartSet); | sourcePartSets.Add(type, sourcePartSet); |
} | } |
switch ((ResourceFlowMode)this.resourceFlowModes[type]) | switch ((ResourceFlowMode)this.resourceFlowModes[type]) |
{ | { |
case ResourceFlowMode.NO_FLOW: | case ResourceFlowMode.NO_FLOW: |
if (partSim.resources[type] > SimManager.RESOURCE_MIN && partSim.resourceFlowStates[type] != 0) | if (partSim.resources[type] > SimManager.RESOURCE_MIN && partSim.resourceFlowStates[type] != 0) |
{ | { |
//sourcePartSet = new HashSet<PartSim>(); | //sourcePartSet = new HashSet<PartSim>(); |
//MonoBehaviour.print("SetResourceDrains(" + name + ":" + partId + ") setting sources to just this"); | //MonoBehaviour.print("SetResourceDrains(" + name + ":" + partId + ") setting sources to just this"); |
sourcePartSet.Add(partSim); | sourcePartSet.Add(partSim); |
} | } |
break; | break; |
case ResourceFlowMode.ALL_VESSEL: | case ResourceFlowMode.ALL_VESSEL: |
case ResourceFlowMode.ALL_VESSEL_BALANCE: | |
for (int i = 0; i < allParts.Count; i++) | for (int i = 0; i < allParts.Count; i++) |
{ | { |
PartSim aPartSim = allParts[i]; | PartSim aPartSim = allParts[i]; |
if (aPartSim.resources[type] > SimManager.RESOURCE_MIN && aPartSim.resourceFlowStates[type] != 0) | if (aPartSim.resources[type] > SimManager.RESOURCE_MIN && aPartSim.resourceFlowStates[type] != 0) |
{ | { |
sourcePartSet.Add(aPartSim); | sourcePartSet.Add(aPartSim); |
} | } |
} | } |
break; | break; |
case ResourceFlowMode.STAGE_PRIORITY_FLOW: | case ResourceFlowMode.STAGE_PRIORITY_FLOW: |
case ResourceFlowMode.STAGE_PRIORITY_FLOW_BALANCE: | |
foreach (HashSet<PartSim> stagePartSet in stagePartSets.Values) | foreach (HashSet<PartSim> stagePartSet in stagePartSets.Values) |
{ | { |
stagePartSet.Clear(); | stagePartSet.Clear(); |
} | } |
var maxStage = -1; | var maxStage = -1; |
//Logger.Log(type); | //Logger.Log(type); |
for (int i = 0; i < allParts.Count; i++) | for (int i = 0; i < allParts.Count; i++) |
{ | { |
var aPartSim = allParts[i]; | var aPartSim = allParts[i]; |
if (aPartSim.resources[type] <= SimManager.RESOURCE_MIN || aPartSim.resourceFlowStates[type] == 0) | if (aPartSim.resources[type] <= SimManager.RESOURCE_MIN || aPartSim.resourceFlowStates[type] == 0) |
{ | { |
continue; | continue; |
} | } |
int stage = aPartSim.DecouplerCount(); | int stage = aPartSim.DecouplerCount(); |
if (stage > maxStage) | if (stage > maxStage) |
{ | { |
maxStage = stage; | maxStage = stage; |
} | } |
HashSet<PartSim> tempPartSet; | HashSet<PartSim> tempPartSet; |
if (!stagePartSets.TryGetValue(stage, out tempPartSet)) | if (!stagePartSets.TryGetValue(stage, out tempPartSet)) |
{ | { |
tempPartSet = new HashSet<PartSim>(); | tempPartSet = new HashSet<PartSim>(); |
stagePartSets.Add(stage, tempPartSet); | stagePartSets.Add(stage, tempPartSet); |
} | } |
tempPartSet.Add(aPartSim); | tempPartSet.Add(aPartSim); |
} | } |
for (int j = maxStage; j >= 0; j--) | for (int j = maxStage; j >= 0; j--) |
{ | { |
HashSet<PartSim> stagePartSet; | HashSet<PartSim> stagePartSet; |
if (stagePartSets.TryGetValue(j, out stagePartSet) && stagePartSet.Count > 0) | if (stagePartSets.TryGetValue(j, out stagePartSet) && stagePartSet.Count > 0) |
{ | { |
// We have to copy the contents of the set here rather than copying the set reference or | // We have to copy the contents of the set here rather than copying the set reference or |
// bad things (tm) happen | // bad things (tm) happen |
foreach (PartSim aPartSim in stagePartSet) | foreach (PartSim aPartSim in stagePartSet) |
{ | { |
sourcePartSet.Add(aPartSim); | sourcePartSet.Add(aPartSim); |
} | } |
break; | break; |
} | } |
} | } |
break; | break; |
case ResourceFlowMode.STACK_PRIORITY_SEARCH: | case ResourceFlowMode.STACK_PRIORITY_SEARCH: |
visited.Clear(); | visited.Clear(); |
if (SimManager.logOutput) | if (SimManager.logOutput) |
{ | { |
log = new LogMsg(); | log = new LogMsg(); |
log.buf.AppendLine("Find " + ResourceContainer.GetResourceName(type) + " sources for " + partSim.name + ":" + partSim.partId); | log.buf.AppendLine("Find " + ResourceContainer.GetResourceName(type) + " sources for " + partSim.name + ":" + partSim.partId); |
} | } |
partSim.GetSourceSet(type, allParts, visited, sourcePartSet, log, ""); | partSim.GetSourceSet(type, PhysicsGlobals.Stack_PriUsesSurf, allParts, visited, sourcePartSet, log, ""); |
if (SimManager.logOutput && log != null) | |
{ | |
MonoBehaviour.print(log.buf); | |
} | |
break; | |
case ResourceFlowMode.STAGE_STACK_FLOW: | |
case ResourceFlowMode.STAGE_STACK_FLOW_BALANCE: | |
visited.Clear(); | |