Implement build overlay.
Implement build overlay.

--- /dev/null
+++ b/KerbalEngineer/Editor/BuildOverlayResources.cs
@@ -1,1 +1,182 @@
+// 
+//     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 System.Collections.Generic;
+using System.Linq;
+
+using KerbalEngineer.Extensions;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    public class BuildOverlayResources : MonoBehaviour
+    {
+        #region Fields
+
+        private readonly Dictionary<int, ResourceInfoItem> resources = new Dictionary<int, ResourceInfoItem>();
+        private bool open = true;
+        private float openPercent;
+        private GUIContent tabContent;
+        private Rect tabPosition;
+        private Vector2 tabSize;
+        private Rect windowPosition = new Rect(0.0f, 0.0f, BuildOverlay.MinimumWidth, 0.0f);
+
+        #endregion
+
+        #region Properties
+
+        public bool Open
+        {
+            get { return this.open; }
+            set { this.open = value; }
+        }
+
+        #endregion
+
+        #region Methods: protected
+
+        protected void OnGUI()
+        {
+            try
+            {
+                if (!BuildOverlay.Visible || this.resources.Count == 0)
+                {
+                    return;
+                }
+
+                this.open = GUI.Toggle(this.tabPosition, this.open, this.tabContent, BuildOverlay.TabStyle);
+                this.windowPosition = GUILayout.Window(this.GetInstanceID(), this.windowPosition, this.Window, String.Empty, BuildOverlay.WindowStyle);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.tabContent = new GUIContent("RESOURCES");
+                this.tabSize = BuildOverlay.TabStyle.CalcSize(this.tabContent);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            try
+            {
+                if (!BuildOverlay.Visible)
+                {
+                    return;
+                }
+
+                var previousCount = this.resources.Count;
+                this.resources.Clear();
+                foreach (var resource in EditorLogic.fetch.ship.parts.SelectMany(p => p.Resources.list).Where(r => r.amount > 0.0))
+                {
+                    if (this.resources.ContainsKey(resource.info.id))
+                    {
+                        this.resources[resource.info.id].Amount += resource.amount;
+                    }
+                    else
+                    {
+                        this.resources.Add(resource.info.id, new ResourceInfoItem(resource));
+                    }
+                }
+
+                if (this.resources.Count < previousCount)
+                {
+                    this.windowPosition.height = 0;
+                }
+
+                if (this.open && this.openPercent < 1.0f)
+                {
+                    this.openPercent = Mathf.Clamp(this.openPercent + Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+                }
+                else if (!this.open && this.openPercent > 0.0f)
+                {
+                    this.openPercent = Mathf.Clamp(this.openPercent - Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+                }
+
+                this.windowPosition.x = BuildOverlay.BuildOverlayVessel.WindowPosition.xMax + 5.0f;
+                this.windowPosition.y = Mathf.Lerp(Screen.height, Screen.height - this.windowPosition.height, this.openPercent);
+                this.tabPosition.width = this.tabSize.x;
+                this.tabPosition.height = this.tabSize.y;
+                this.tabPosition.x = this.windowPosition.x;
+                this.tabPosition.y = this.windowPosition.y - this.tabPosition.height;
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private void Window(int windowId)
+        {
+            try
+            {
+                var firstItem = true;
+                foreach (var resource in this.resources)
+                {
+                    if (!firstItem)
+                    {
+                        GUILayout.Space(2.0f);
+                    }
+                    firstItem = false;
+
+                    GUILayout.BeginHorizontal();
+
+                    GUILayout.Label(resource.Value.Name + ":", BuildOverlay.NameStyle);
+                    GUILayout.Space(50.0f);
+                    if (resource.Value.Mass > 0.0)
+                    {
+                        GUILayout.Label("(" + resource.Value.Mass.ToMass() + ") " + resource.Value.Amount.ToString("N1"), BuildOverlay.ValueStyle);
+                    }
+                    else
+                    {
+                        GUILayout.Label(resource.Value.Amount.ToString("N1"), BuildOverlay.ValueStyle);
+                    }
+
+                    GUILayout.EndHorizontal();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Editor/BuildOverlayVessel.cs
@@ -1,1 +1,188 @@
+// 
+//     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 System.Collections.Generic;
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.VesselSimulator;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    public class BuildOverlayVessel : MonoBehaviour
+    {
+        #region Fields
+
+        private readonly List<PartInfoItem> infoItems = new List<PartInfoItem>();
+
+        private Stage lastStage;
+        private bool open = true;
+        private float openPercent;
+        private GUIContent tabContent;
+        private Rect tabPosition;
+        private Vector2 tabSize;
+        private Rect windowPosition = new Rect(300.0f, 0.0f, BuildOverlay.MinimumWidth, 0.0f);
+
+        #endregion
+
+        #region Properties
+
+        public bool Open
+        {
+            get { return this.open; }
+            set { this.open = value; }
+        }
+
+        public Rect WindowPosition
+        {
+            get { return this.windowPosition; }
+        }
+
+        #endregion
+
+        #region Methods: protected
+
+        protected void OnGUI()
+        {
+            try
+            {
+                if (!BuildOverlay.Visible || EditorLogic.startPod == null || this.lastStage == null)
+                {
+                    return;
+                }
+
+                this.open = GUI.Toggle(this.tabPosition, this.open, this.tabContent, BuildOverlay.TabStyle);
+                this.windowPosition = GUILayout.Window(this.GetInstanceID(), this.windowPosition, this.VesselWindow, String.Empty, BuildOverlay.WindowStyle);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Start()
+        {
+            try
+            {
+                this.tabContent = new GUIContent("VESSEL");
+                this.tabSize = BuildOverlay.TabStyle.CalcSize(this.tabContent);
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        protected void Update()
+        {
+            if (!BuildOverlay.Visible || EditorLogic.startPod == null)
+            {
+                return;
+            }
+
+            if (this.open && this.openPercent < 1.0f)
+            {
+                this.openPercent = Mathf.Clamp(this.openPercent + Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+            }
+            else if (!this.open && this.openPercent > 0.0f)
+            {
+                this.openPercent = Mathf.Clamp(this.openPercent - Time.deltaTime * BuildOverlay.TabSpeed, 0.0f, 1.0f);
+            }
+
+            this.windowPosition.y = Mathf.Lerp(Screen.height, Screen.height - this.windowPosition.height, this.openPercent);
+            this.tabPosition.width = this.tabSize.x;
+            this.tabPosition.height = this.tabSize.y;
+            this.tabPosition.x = this.windowPosition.x;
+            this.tabPosition.y = this.windowPosition.y - this.tabPosition.height;
+
+            SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
+
+            if (BuildAdvanced.Instance.ShowAtmosphericDetails)
+            {
+                SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01;
+            }
+            else
+            {
+                SimManager.Atmosphere = 0.0;
+            }
+
+            SimManager.RequestSimulation();
+            SimManager.TryStartSimulation();
+
+            if (SimManager.ResultsReady())
+            {
+                this.lastStage = SimManager.LastStage;
+            }
+
+            if (this.lastStage != null)
+            {
+                this.infoItems.Clear();
+                this.infoItems.Add(new PartInfoItem("Delta-V", this.lastStage.totalDeltaV.ToString("N0") + "m/s"));
+                this.infoItems.Add(new PartInfoItem("Mass", this.lastStage.totalMass.ToMass()));
+                this.infoItems.Add(new PartInfoItem("TWR", this.lastStage.thrustToWeight.ToString("F2")));
+                this.infoItems.Add(new PartInfoItem("Parts", this.lastStage.partCount.ToString("N0")));
+            }
+        }
+
+        #endregion
+
+        #region Methods: private
+
+        private void VesselWindow(int windowId)
+        {
+            try
+            {
+                var firstItem = true;
+                foreach (var item in this.infoItems)
+                {
+                    if (!firstItem)
+                    {
+                        GUILayout.Space(2.0f);
+                    }
+                    firstItem = false;
+
+                    GUILayout.BeginHorizontal();
+                    if (item.Value != null)
+                    {
+                        GUILayout.Label(item.Name + ":", BuildOverlay.NameStyle);
+                        GUILayout.Space(50.0f);
+                        GUILayout.Label(item.Value, BuildOverlay.ValueStyle);
+                    }
+                    else
+                    {
+                        GUILayout.Label(item.Name, BuildOverlay.NameStyle);
+                    }
+                    GUILayout.EndHorizontal();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Exception(ex);
+            }
+        }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Editor/PartInfoItem.cs
@@ -1,1 +1,47 @@
+// 
+//     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/>.
+// 
 
+namespace KerbalEngineer.Editor
+{
+    public class PartInfoItem
+    {
+        #region Constructors
+
+        public PartInfoItem(string name)
+        {
+            this.Name = name;
+        }
+
+        public PartInfoItem(string name, string value)
+        {
+            this.Name = name;
+            this.Value = value;
+        }
+
+        #endregion
+
+        #region Properties
+
+        public string Name { get; set; }
+
+        public string Value { get; set; }
+
+        #endregion
+    }
+}

--- /dev/null
+++ b/KerbalEngineer/Editor/ResourceInfoItem.cs
@@ -1,1 +1,56 @@
+// 
+//     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 KerbalEngineer.Extensions;
+
+#endregion
+
+namespace KerbalEngineer.Editor
+{
+    public class ResourceInfoItem
+    {
+        #region Constructors
+
+        public ResourceInfoItem(PartResource resource)
+        {
+            this.Definition = resource.GetDefinition();
+            this.Name = this.Definition.name;
+            this.Amount = resource.amount;
+        }
+
+        #endregion
+
+        #region Properties
+
+        public double Amount { get; set; }
+
+        public PartResourceDefinition Definition { get; set; }
+
+        public double Mass
+        {
+            get { return this.Amount * this.Definition.density; }
+        }
+
+        public string Name { get; set; }
+
+        #endregion
+    }
+}

 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ
 Binary files a/Release/KerbalEngineer-1.0.8.1.zip and b/Release/KerbalEngineer-1.0.8.1.zip differ