protected override Rect Setup()
        {
            formatter = (System.Globalization.NumberFormatInfo)System.Globalization.NumberFormatInfo.CurrentInfo.Clone();
            formatter.CurrencySymbol        = string.Empty;
            formatter.CurrencyDecimalDigits = 2;
            formatter.NumberDecimalDigits   = 2;
            formatter.PercentDecimalDigits  = 2;
            audio = AudioPlayer.Audio;
            if (audio == null)
            {
                Log.Debug("[ScienceAlert]:DraggableOptionsWindow: Failed to find AudioPlayer instance");
            }

            filterList.Add(new GUIContent("Unresearched"));
            filterList.Add(new GUIContent("Not maxed"));
            filterList.Add(new GUIContent("< 50% collected"));
            filterList.Add(new GUIContent("< 90% collected"));

            openButton     = ResourceUtil.GetEmbeddedTexture("Textures.btnOpen.png");
            deleteButton   = ResourceUtil.GetEmbeddedTexture("Textures.btnDelete.png");
            renameButton   = ResourceUtil.GetEmbeddedTexture("Textures.btnRename.png");
            saveButton     = ResourceUtil.GetEmbeddedTexture("Textures.btnSave.png");
            expandButton   = ResourceUtil.GetEmbeddedTexture("Textures.btnExpand.png");
            collapseButton = Instantiate(expandButton);
            ResourceUtil.FlipTexture(collapseButton, true, true);
            collapseButton.Compress(false);
            expandButton.Compress(false);

            blackPixel.SetPixel(0, 0, Color.black);
            blackPixel.Apply();
            blackPixel.filterMode = FilterMode.Bilinear;
            whiteLabel            = Instantiate(Settings.Skin);
            whiteLabel.label.onNormal.textColor  = Color.white;
            whiteLabel.toggle.onNormal.textColor = Color.white;
            whiteLabel.label.onActive.textColor  = Color.white;
            submenu       = OpenPane.None;
            Title         = "ScienceAlert Options";
            miniLabelLeft = new GUIStyle(Skin.label)
            {
                fontSize = 10
            };
            miniLabelLeft.normal.textColor = miniLabelLeft.onNormal.textColor = Color.white;
            miniLabelRight = new GUIStyle(miniLabelLeft)
            {
                alignment = TextAnchor.MiddleRight
            };
            miniLabelCenter = new GUIStyle(miniLabelLeft)
            {
                alignment = TextAnchor.MiddleCenter
            };
            Settings.Instance.OnSave += OnAboutToSave;
            OnVisibilityChange       += OnVisibilityChanged;
            GameEvents.onVesselChange.Add(OnVesselChanged);
            LoadFrom(Settings.Instance.additional.GetNode("OptionsWindow") ?? new ConfigNode());
            return(new Rect(windowRect.x, windowRect.y, 324f, Screen.height / 5 * 3));
        }
Exemplo n.º 2
0
        private void SliceAtlasTexture()
        {
            Func <int, int, string> GetFrame = delegate(int frame, int desiredLen)
            {
                string str = frame.ToString();
                while (str.Length < desiredLen)
                {
                    str = "0" + str;
                }
                return(str);
            };

            // load textures
            try
            {
                if (!GameDatabase.Instance.ExistsTexture(NormalFlaskTexture))
                {
                    // load normal flask texture
                    Log.Debug("Loading normal flask texture");

                    Texture2D nflask = ResourceUtil.GetEmbeddedTexture("Textures.flask.png", true);
                    if (nflask == null)
                    {
                        Log.Error("Failed to create normal flask texture!");
                    }
                    else
                    {
                        GameDatabase.TextureInfo ti = new GameDatabase.TextureInfo(null, nflask, false, true, true);
                        ti.name = NormalFlaskTexture;
                        GameDatabase.Instance.databaseTexture.Add(ti);
                        // Log.Debug("Created normal flask texture {0}", ti.name);
                    }
                    nflask = ResourceUtil.GetEmbeddedTexture("Textures.flask-38.png", true);
                    if (nflask == null)
                    {
                        Log.Error("Failed to create normal flask-38 texture!");
                    }
                    else
                    {
                        GameDatabase.TextureInfo ti = new GameDatabase.TextureInfo(null, nflask, false, true, true);
                        ti.name = NormalFlaskTexture + "-38";
                        GameDatabase.Instance.databaseTexture.Add(ti);
                        // Log.Debug("Created normal flask texture {0}", ti.name);
                    }
                    //
                    // Load textures for animation here
                    //
                    Texture2D sheet = ResourceUtil.GetEmbeddedTexture("Textures.sheet.png");
                    if (sheet == null)
                    {
                        Log.Error("Failed to create sprite sheet texture!");
                    }
                    else
                    {
                        var rt           = RenderTexture.GetTemporary(sheet.width, sheet.height);
                        var oldRt        = RenderTexture.active;
                        int invertHeight = ((FrameCount - 1) / (sheet.width / 24)) * 24;

                        Graphics.Blit(sheet, rt);
                        RenderTexture.active = rt;

                        for (int i = 0; i < FrameCount; ++i)
                        {
                            StarFlaskTextures.Add(NormalFlaskTexture + GetFrame(i + 1, 4));
                            Texture2D sliced = new Texture2D(24, 24, TextureFormat.ARGB32, false);

                            sliced.ReadPixels(new Rect((i % (sheet.width / 24)) * 24, /*invertHeight -*/ (i / (sheet.width / 24)) * 24, 24, 24), 0, 0);
                            sliced.Apply();

                            GameDatabase.TextureInfo ti = new GameDatabase.TextureInfo(null, sliced, false, false, false);
                            ti.name = StarFlaskTextures.Last();

                            GameDatabase.Instance.databaseTexture.Add(ti);
                            // Log.Debug("Added sheet texture {0}", ti.name);
                        }

                        RenderTexture.active = oldRt;
                        RenderTexture.ReleaseTemporary(rt);
                    }

                    sheet = ResourceUtil.GetEmbeddedTexture("Textures.sheet-38.png");
                    if (sheet == null)
                    {
                        Log.Error("Failed to create sprite sheet texture!");
                    }
                    else
                    {
                        var rt           = RenderTexture.GetTemporary(sheet.width, sheet.height);
                        var oldRt        = RenderTexture.active;
                        int invertHeight = ((FrameCount - 1) / (sheet.width / 38)) * 38;

                        Graphics.Blit(sheet, rt);
                        RenderTexture.active = rt;

                        for (int i = 0; i < FrameCount; ++i)
                        {
                            StarFlaskTextures38.Add(NormalFlaskTexture + "-38-" + GetFrame(i + 1, 4));
                            Texture2D sliced = new Texture2D(38, 38, TextureFormat.ARGB32, false);

                            sliced.ReadPixels(new Rect((i % (sheet.width / 38)) * 38, /*invertHeight -*/ (i / (sheet.width / 38)) * 38, 38, 38), 0, 0);
                            sliced.Apply();

                            GameDatabase.TextureInfo ti = new GameDatabase.TextureInfo(null, sliced, false, false, false);
                            ti.name = StarFlaskTextures38.Last();

                            GameDatabase.Instance.databaseTexture.Add(ti);
                            // Log.Debug("Added sheet texture {0}", ti.name);
                        }

                        RenderTexture.active = oldRt;
                        RenderTexture.ReleaseTemporary(rt);
                    }
                    Log.Debug("Finished loading sprite sheet-38 textures.");
                }
                else
                { // textures already loaded
                    for (int i = 0; i < FrameCount; ++i)
                    {
                        StarFlaskTextures.Add(NormalFlaskTexture + GetFrame(i + 1, 4));
                        StarFlaskTextures38.Add(NormalFlaskTexture + "-38-" + GetFrame(i + 1, 4));
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Failed to load textures: {0}", e);
            }
        }
        /// <summary>
        /// Waits for the Application Launcher before beginning initialization
        /// </summary>
        /// <returns></returns>
        System.Collections.IEnumerator WaitOnAppLauncher()
        {
            Log.Debug("Waiting on AppLauncher...");

            while (!ApplicationLauncher.Ready)
            {
                yield return(null);
            }

            Log.Verbose("Retrieving animation sheet.");
            var sheet = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.sheet_app.png", false, false);

            if (sheet == null)
            {
                Log.Error("Failed to locate embedded app sheet texture!");

                // well ... without it we're sunk. Something is better than
                // nothing. We can't let the stock behaviour fail
                Log.Warning("Creating dummy sprite texture");

                sheet = new Texture2D(38, 38, TextureFormat.ARGB32, false);
                sheet.SetPixels32(Enumerable.Repeat((Color32)Color.clear, 38 * 38).ToArray());
                sheet.Apply();
            }

            Log.Verbose("Setting up sprite");
            sprite = PackedSprite.Create("ScienceAlert.Button.Sprite", Vector3.zero);
            sprite.SetMaterial(new Material(Shader.Find("Sprite/Vertex Colored"))
            {
                mainTexture = sheet
            });
            sprite.renderer.sharedMaterial.mainTexture.filterMode = FilterMode.Point;
            sprite.Setup(38f, 38f);
            sprite.SetFramerate(Settings.Instance.StarFlaskFrameRate);
            sprite.SetAnchor(SpriteRoot.ANCHOR_METHOD.UPPER_LEFT);
            sprite.gameObject.layer = LayerMask.NameToLayer("EzGUI_UI");



            // normal state
            Log.Verbose("Setting up normal animation");
            UVAnimation normal = new UVAnimation()
            {
                name = "Unlit", loopCycles = 0, framerate = Settings.Instance.StarFlaskFrameRate
            };

            normal.BuildUVAnim(sprite.PixelCoordToUVCoord(9 * 38, 8 * 38), sprite.PixelSpaceToUVSpace(38, 38), 1, 1, 1);

            // animated state
            Log.Verbose("Setting up star flask animation");
            UVAnimation anim = new UVAnimation()
            {
                name = "Spin", loopCycles = -1, framerate = Settings.Instance.StarFlaskFrameRate
            };

            anim.BuildWrappedUVAnim(new Vector2(0, sprite.PixelCoordToUVCoord(0, 38).y), sprite.PixelSpaceToUVSpace(38, 38), 100);


            // add animations to button
            sprite.AddAnimation(normal);
            sprite.AddAnimation(anim);

            sprite.PlayAnim("Unlit");

            Log.Verbose("Creating mod button...");
            button = ApplicationLauncher.Instance.AddModApplication(
                OnToggle,
                OnToggle,

                () => { },
                () => { },
                () => { },
                () => { },
                ApplicationLauncher.AppScenes.FLIGHT | ApplicationLauncher.AppScenes.MAPVIEW,
                sprite);

            GameEvents.onGUIApplicationLauncherUnreadifying.Add(AppLauncherUnreadifying);

            Log.Debug("AppLauncherInterface: Button transform = {0}", button.transform.position.ToString());

            Log.Verbose("AppLauncherInterface ready");
        }
        /******************************************************************************
        *                    Implementation Details
        ******************************************************************************/

        protected override Rect Setup()
        {
            // position blocker in front of ApplicationLauncher buttons. The window is going to be drawn on
            // top of them regardless; this will just prevent us from accidentally interacting with them
            backstop.SetZ(ApplicationLauncher.Instance.anchor.transform.position.z - 50f);

            // culture setting
            Log.Normal("Configuring NumberFormatInfo for current locale");
            formatter = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
            formatter.CurrencySymbol        = string.Empty;
            formatter.CurrencyDecimalDigits = 2;
            formatter.NumberDecimalDigits   = 2;
            formatter.PercentDecimalDigits  = 2;


            audio = AudioPlayer.Audio;

            if (audio == null)
            {
                Log.Error("DraggableOptionsWindow: Failed to find AudioPlayer instance");
            }


            var rawIds    = ResearchAndDevelopment.GetExperimentIDs();
            var sortedIds = rawIds.OrderBy(expid => ResearchAndDevelopment.GetExperiment(expid).experimentTitle);

            Log.Debug("OptionsWindow: sorted {0} experiment IDs", sortedIds.Count());

            foreach (var id in sortedIds)
            {
                experimentIds.Add(id, (int)Convert.ChangeType(ProfileManager.ActiveProfile[id].Filter, ProfileManager.ActiveProfile[id].Filter.GetTypeCode()));
                Log.Debug("Settings: experimentId {0} has filter index {1}", id, experimentIds[id]);
            }

            /*
             *  Unresearched = 0,
             *  NotMaxed = 1,
             *  LessThanFiftyPercent = 2,
             *  LessThanNinetyPercent = 3
             */
            filterList.Add(new GUIContent("Unresearched"));
            filterList.Add(new GUIContent("Not maxed"));
            filterList.Add(new GUIContent("< 50% collected"));
            filterList.Add(new GUIContent("< 90% collected"));


            openButton   = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.btnOpen.png", false);
            saveButton   = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.btnSave.png", false);
            returnButton = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.btnReturn.png", false);
            deleteButton = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.btnDelete.png", false);
            renameButton = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.btnRename.png", false);

            var tex = ResourceUtil.GetEmbeddedTexture("ScienceAlert.Resources.btnExpand.png", false);

            if (tex == null)
            {
                Log.Error("Failed to retrieve expand button texture from stream");
            }
            else
            {
                Log.Debug("Collapse button texture loaded successfully");
                expandButton = tex;

                collapseButton = UnityEngine.Texture.Instantiate(expandButton) as Texture2D;
                ResourceUtil.FlipTexture(collapseButton, true, true);

                collapseButton.Compress(false);
                expandButton.Compress(false);
            }

            blackPixel.SetPixel(0, 0, Color.black); blackPixel.Apply();
            blackPixel.filterMode = FilterMode.Bilinear;

            whiteLabel = (GUISkin)GUISkin.Instantiate(Settings.Skin);
            whiteLabel.label.onNormal.textColor  = Color.white;
            whiteLabel.toggle.onNormal.textColor = Color.white;
            whiteLabel.label.onActive.textColor  = Color.white;

            submenu = OpenPane.None;
            Title   = "ScienceAlert Options";

            // smaller label for less important text hints
            miniLabelLeft                  = new GUIStyle(Skin.label);
            miniLabelLeft.fontSize         = 10;
            miniLabelLeft.normal.textColor = miniLabelLeft.onNormal.textColor = Color.white;

            miniLabelRight           = new GUIStyle(miniLabelLeft);
            miniLabelRight.alignment = TextAnchor.MiddleRight;

            miniLabelCenter           = new GUIStyle(miniLabelLeft);
            miniLabelCenter.alignment = TextAnchor.MiddleCenter;

            Settings.Instance.OnSave += OnAboutToSave;
            base.OnVisibilityChange  += OnVisibilityChanged;
            GameEvents.onVesselChange.Add(OnVesselChanged);

            LoadFrom(Settings.Instance.additional.GetNode("OptionsWindow") ?? new ConfigNode());

            return(new Rect(windowRect.x, windowRect.y, 324, Screen.height / 5 * 3));
        }