示例#1
0
    // coroutine to update the ScreenCap at the end of the current frame
    private IEnumerator UpdateScreenCapCoroutine(xARMScreenCap screenCapToUpdate)
    {
        yield return(new WaitForEndOfFrame());

        xARMManager.ReadScreenCapFromGameView(screenCapToUpdate);
        xARMManager.ScreenCapUpdateInProgress = false;
    }
示例#2
0
    private static void addOrUpdateScreenCap(xARMScreenCap screenCapToAdd, xARMScreenCap screenCapToReplace = null)
    {
        int screenCapIndex;

        // replace existing SC
        if (screenCapToReplace is xARMScreenCap)
        {
            // find SC to replace
            screenCapIndex = getScreenCapIndex(screenCapToReplace);
            // no SC to replace > find SC to update
            if (screenCapIndex == -1)
            {
                screenCapIndex = getScreenCapIndex(screenCapToAdd);
            }
        }
        else
        {
            screenCapIndex = getScreenCapIndex(screenCapToAdd);
        }

        if (screenCapIndex >= 0)         // update (don't add duplicates)
        // values to keep
        {
            bool origEnabledState = AvailScreenCaps[screenCapIndex].Enabled;

            AvailScreenCaps[screenCapIndex]         = screenCapToAdd;
            AvailScreenCaps[screenCapIndex].Enabled = origEnabledState;
        }
        else             // add
        {
            AvailScreenCaps.Add(screenCapToAdd);
        }
    }
示例#3
0
    public static void ChangeActiveScreenCap(int screenCapIndex)
    {
        if (screenCapIndex >= activeScreenCaps.Count)
        {
            screenCapIndex = 0;                                                  // reset if active SC list is shorter now
        }
        xARMManager.Config.PreviewSelectedScreenCapIndex = screenCapIndex;

        // repaint window on next update
        repaintNextUpdate = true;

        if (activeScreenCaps.Count > 0)
        {
            xARMScreenCap previousScreenCap = selectedScreenCap;

            selectedScreenCap = activeScreenCaps[screenCapIndex];                 // get Ref to selected SC
            xARMManager.DefaultGameViewResolution = selectedScreenCap.Resolution; // set as new default resolution

            // change GameView resolution if activated and selection was changed
            if (xARMManager.Config.GameViewInheritsPreviewSize && !selectedScreenCap.Equals(previousScreenCap))
            {
                // switch Game View resolution via next Update() (doesn't work correctly inside OnGUI)
                resizeGameViewToNewDefault = true;
            }
        }
    }
示例#4
0
    public static void ChangeActiveScreenCap(int screenCapIndex)
    {
        // ensure correct index
        if (screenCapIndex >= activeScreenCaps.Count)
        {
            screenCapIndex = 0;
        }
        else if (screenCapIndex < 0)
        {
            screenCapIndex = activeScreenCaps.Count - 1;
        }
        xARMManager.Config.PreviewSelectedScreenCapIndex = screenCapIndex;

        // repaint windows on next update
        xARMManager.RepaintAllWindows();

        if (activeScreenCaps.Count > 0)
        {
            xARMScreenCap previousScreenCap = SelectedScreenCap;

            SelectedScreenCap = activeScreenCaps[screenCapIndex];                 // get Ref to selected SC
            xARMManager.DefaultGameViewResolution = SelectedScreenCap.Resolution; // set as new default resolution

            // change GameView resolution if activated and selection was changed
            if (xARMManager.Config.GameViewInheritsPreviewSize && !SelectedScreenCap.Equals(previousScreenCap))
            {
                // switch Game View resolution via next Update() (doesn't work correctly inside OnGUI)
                resizeGameViewToNewDefault = true;
            }
        }
    }
示例#5
0
    private static void addOrReplaceScreenCap(xARMScreenCap screenCapToAdd, xARMScreenCap screenCapToReplace)
    {
        int screenCapIndexToReplace = getScreenCapIndex(screenCapToReplace);
        int screenCapIndexToAdd     = getScreenCapIndex(screenCapToAdd);

        if (screenCapIndexToReplace >= 0)         // replace
        // values to keep
        {
            bool origEnabledState = AvailScreenCaps[screenCapIndexToReplace].Enabled;

            AvailScreenCaps[screenCapIndexToReplace]         = screenCapToAdd;
            AvailScreenCaps[screenCapIndexToReplace].Enabled = origEnabledState;
        }
        else if (screenCapIndexToAdd >= 0)           // update (don't add duplicates)
        // values to keep
        {
            bool origEnabledState = AvailScreenCaps[screenCapIndexToAdd].Enabled;

            AvailScreenCaps[screenCapIndexToAdd]         = screenCapToAdd;
            AvailScreenCaps[screenCapIndexToAdd].Enabled = origEnabledState;
        }
        else             // add
        {
            AvailScreenCaps.Add(screenCapToAdd);
        }
    }
示例#6
0
 public static void UpdateScreenCapAtEOF(xARMScreenCap screenCap)
 {
     // capture Render at EndOfFrame
     Proxy.StartUpdateScreenCapCoroutine(screenCap);
     // force EndOfFrame - to execute yield
     GameView.Repaint();
 }
示例#7
0
    // export ScreenCap as PNG file
    private static void ExportScreenCapToFile(xARMScreenCap screenCap, string path)
    {
        FileStream   fs = new FileStream(path, FileMode.Create);
        BinaryWriter bw = new BinaryWriter(fs);

        bw.Write(screenCap.Texture.EncodeToPNG());
        bw.Close();
        fs.Close();
    }
示例#8
0
    private IEnumerator WaitXFrames(xARMScreenCap screenCap, int frameCount)
    {
        while (frameCount > 0)
        {
            yield return(null);            // wait until next frame

            frameCount--;
        }
        xARMManager.UpdateScreenCapAtEOF(screenCap);
    }
示例#9
0
    public static void ReadScreenCapFromGameView(xARMScreenCap screenCap)
    {
        int width  = (int)screenCap.Resolution.x;
        int height = (int)screenCap.Resolution.y;

        // check if the GameView has the correct size
        if (screenCap.Resolution.x == Screen.width && screenCap.Resolution.y == Screen.height)
        {
            // read screen to Tex2D
            Texture2D screenTex = new Texture2D(width, height, TextureFormat.RGB24, false);
            screenTex.ReadPixels(new Rect(0, 0, width, height), 0, 0, false);
            screenTex.Apply(false, false);              // readable to enable export as file

            // update ScreenCap
            screenCap.Texture           = screenTex;
            screenCap.LastUpdateTime    = lastChangeInEditorTime;
            screenCap.LastUpdateTryTime = lastChangeInEditorTime;
            screenCap.UpdatedSuccessful = true;

            // repaint editor windows
            if (myxARMPreviewWindow)
            {
                myxARMPreviewWindow.Repaint();
            }
            if (myxARMGalleryWindow)
            {
                myxARMGalleryWindow.Repaint();
            }
        }
        else
        {
            // mark this ScreenCap as not updated and display message
            screenCap.LastUpdateTryTime = lastChangeInEditorTime;
            screenCap.UpdatedSuccessful = false;

#if UNITY_4_0 || UNITY_4_0_1 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3
            xARMGalleryWindow.WarningBoxText = "Could not update all ScreenCaps. Switch 'GameView' to 'Free Aspect'.";
            xARMPreviewWindow.WarningBoxText = "Could not update all ScreenCaps. Switch 'GameView' to 'Free Aspect'.";
#else   // 5.4+
            // detect HiDPI mode and toolbar offset
            AutoDetectGameViewSettings(screenCap.Resolution, new Vector2(Screen.width, Screen.height));

            xARMGalleryWindow.WarningBoxText = "Could not update all ScreenCaps. Ensure 'GameView' is set to 'Free Aspect' and retry (Auto detect of HiDPI mode and toolbar offset was executed).";
            xARMPreviewWindow.WarningBoxText = "Could not update all ScreenCaps. Ensure 'GameView' is set to 'Free Aspect' and retry (Auto detect of HiDPI mode and toolbar offset was executed).";
#endif
        }

        // run custom code
        if (OnPostScreenCapUpdate != null)
        {
            OnPostScreenCapUpdate();
        }

        UpdatingScreenCap = null;
    }
示例#10
0
 public static bool IsToUpdate(xARMScreenCap screenCap)
 {
     if (screenCap.LastUpdateTime != lastChangeInEditorTime && screenCap.LastUpdateTryTime != lastChangeInEditorTime)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
示例#11
0
    // coroutine to update the ScreenCap at the end of the current frame
    private IEnumerator UpdateScreenCapCoroutine(xARMScreenCap screenCapToUpdate)
    {
        yield return(new WaitForEndOfFrame());

        // final check if this yield is still relevant
        if (xARMManager.TargetGameViewResolution == screenCapToUpdate.Resolution)          //
        {
            xARMManager.ReadScreenCapFromGameView(screenCapToUpdate);
        }

        xARMManager.ScreenCapUpdateInProgress = false;
    }
示例#12
0
    private static int getScreenCapIndex(xARMScreenCap screenCapToCheck)
    {
        for (int x = 0; x < AvailScreenCaps.Count; x++)
        {
            if (AvailScreenCaps[x] == screenCapToCheck)
            {
                return(x);
            }
        }

        return(-1);
    }
示例#13
0
    private static void DrawGallery()
    {
        int entriesPerRow = xARMManager.Config.GalleryScreenCapsPerRow;

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();

        for (int x = 0; x < activeScreenCaps.Count; x++)
        {
            xARMScreenCap currScreenCap = activeScreenCaps[x];

            // begin new row?
            if (x % entriesPerRow == 0)
            {
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
            }

            DrawScreenCap(currScreenCap, x);

            // last entry?
            if (x == activeScreenCaps.Count - 1)
            {
                // fill last row to ensure same/correct size of last row entries
                int entriesInLastRow = activeScreenCaps.Count % entriesPerRow;

                if (entriesInLastRow < entriesPerRow && entriesInLastRow != 0 && !xARMManager.Config.UseFixedScreenCapSize)
                {
                    int entriesToFill = entriesPerRow - entriesInLastRow;

                    // add invisible dummy entries
                    for (int y = 0; y < entriesToFill; y++)
                    {
                        // use same layout cammands as below for similar spacing

                        EditorGUILayout.BeginVertical();
                        GUILayoutUtility.GetAspectRect(currScreenCap.Aspect, GUILayout.MinWidth(screenCapMinWidth), GUILayout.MinHeight(screenCapMinHeight));

                        EditorGUILayout.BeginHorizontal();
                        EditorGUILayout.EndHorizontal();

                        EditorGUILayout.EndVertical();
                    }
                }
            }
        }

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();
    }
示例#14
0
    // Draws an default (=bultin) ScreenCap entry line
    private static void DrawDefaultScreenCapEntry(xARMScreenCap screenCap)
    {
        GUILayout.BeginHorizontal("box");
        GUILayout.Space(spacing);

        screenCap.Enabled = GUILayout.Toggle(screenCap.Enabled, "", GUILayout.Width(labelWidthEnabled));
        GUILayout.Label(screenCap.Group.ToString(), GUILayout.Width(labelWidthGroup));
        GUILayout.Label(screenCap.Name, GUILayout.Width(labelWidthName));
        GUILayout.Label(screenCap.Diagonal.ToString() + charInch, GUILayout.Width(labelWidthDiagonal));
        GUILayout.Label(screenCap.DPILabel, GUILayout.Width(labelWidthDPILabel));
        GUILayout.Label(screenCap.DPI.ToString(), GUILayout.Width(labelWidthDPI));
        GUILayout.Label(screenCap.AspectLabel, GUILayout.Width(labelWidthAspectLabel));
        GUILayout.Label(screenCap.Resolution.x + "x" + screenCap.Resolution.y + "px", GUILayout.Width(labelWidthResolution));

        if (screenCap.IsLandscape)
        {
            GUILayout.Label(screenCap.ResolutionLabel + " " + charLandscape, GUILayout.Width(labelWidthResolutionLabel));
            GUILayout.Label("Landscape", GUILayout.Width(labelWidthFormat));
        }
        else
        {
            GUILayout.Label(screenCap.ResolutionLabel + " " + charPortrait, GUILayout.Width(labelWidthResolutionLabel));
            GUILayout.Label("Portrait", GUILayout.Width(labelWidthFormat));
        }

        if (screenCap.StatisticsPositioning == 999)
        {
            GUILayout.Label("n/a", GUILayout.Width(labelWidthStatsPos));
        }
        else
        {
            GUILayout.Label(screenCap.StatisticsPositioning.ToString() + ".", GUILayout.Width(labelWidthStatsPos));
        }

        if (screenCap.StatisticsUsedPercent == -1f)
        {
            GUILayout.Label("n/a", GUILayout.Width(labelWidthStatsPerc));
        }
        else
        {
            GUILayout.Label(screenCap.StatisticsUsedPercent.ToString() + "%", GUILayout.Width(labelWidthStatsPerc));
        }

        GUILayout.Label(screenCap.Description, GUILayout.MinWidth(labelMinWidthDescription));

        GUILayout.EndHorizontal();
    }
示例#15
0
    private static void addOrUpdateScreenCap(xARMScreenCap screenCapToAdd)
    {
        int screenCapIndex = getScreenCapIndex(screenCapToAdd);

        if (screenCapIndex >= 0)         // update (don't add duplicates)
        // values to keep
        {
            bool origEnabledState = AvailScreenCaps[screenCapIndex].Enabled;

            AvailScreenCaps[screenCapIndex]         = screenCapToAdd;
            AvailScreenCaps[screenCapIndex].Enabled = origEnabledState;
        }
        else             // add
        {
            AvailScreenCaps.Add(screenCapToAdd);
        }
    }
示例#16
0
    public static void UpdateScreenCap(xARMScreenCap screenCap)
    {
        // make current ScreenCap available to delegates
        UpdatingScreenCap = screenCap;

        ResizeGameView(screenCap.Resolution);

        // run custom code
        if (OnPreScreenCapUpdate != null)
        {
            OnPreScreenCapUpdate();
        }

        xARMManager.ScreenCapUpdateInProgress = true;

        // wait x frames to ensure correct results with other (lazy) plugins
        Proxy.StartWaitXFramesCoroutine(screenCap, xARMManager.Config.FramesToWait);
    }
示例#17
0
    public static void ReadScreenCapFromGameView(xARMScreenCap screenCap)
    {
        int width  = (int)screenCap.Resolution.x;
        int height = (int)screenCap.Resolution.y;

        // check if the GameView has the correct size
        if (screenCap.Resolution.x == Screen.width && screenCap.Resolution.y == Screen.height)
        {
            // read screen to Tex2D
            Texture2D screenTex = new Texture2D(width, height, TextureFormat.RGB24, false);
            screenTex.ReadPixels(new Rect(0, 0, width, height), 0, 0, false);
            screenTex.Apply(false, false);              // readable to enable export as file

            // update ScreenCap
            screenCap.Texture           = screenTex;
            screenCap.LastUpdateTime    = lastChangeInEditorTime;
            screenCap.LastUpdateTryTime = lastChangeInEditorTime;
            screenCap.UpdatedSuccessful = true;

            // repaint editor windows
            if (myxARMPreviewWindow)
            {
                myxARMPreviewWindow.Repaint();
            }
            if (myxARMGalleryWindow)
            {
                myxARMGalleryWindow.Repaint();
            }
        }
        else
        {
            // mark this ScreenCap as not updated and display message
            screenCap.LastUpdateTryTime      = lastChangeInEditorTime;
            screenCap.UpdatedSuccessful      = false;
            xARMGalleryWindow.WarningBoxText = "Could not update all ScreenCaps. Switch 'GameView' to 'Free Aspect'.";
            xARMPreviewWindow.WarningBoxText = "Could not update all ScreenCaps. Switch 'GameView' to 'Free Aspect'.";
        }

        // run custom code
        if (OnPostScreenCapUpdate != null)
        {
            OnPostScreenCapUpdate();
        }
    }
示例#18
0
    // save one SC as file
    public static void SaveScreenCapFile(xARMScreenCap screenCap)
    {
        if (screenCap.Texture.width != 4)         // not placeholder
        {
            string defaultFileName = screenCap.Name + " " + screenCap.Diagonal + " " + screenCap.DPILabel + " " + screenCap.Resolution.x + "x" + screenCap.Resolution.y + ".png";
            // open export to file panel
            string exportFilePath = EditorUtility.SaveFilePanel("Export ScreenCap as PNG", xARMManager.Config.ExportPath, defaultFileName, "png");

            // export
            if (exportFilePath.Length > 0)
            {
                ExportScreenCapToFile(screenCap, exportFilePath);
            }
        }
        else
        {
            Debug.LogWarning("xARM: ScreenCap not exported. Please update it before export.");
        }
    }
示例#19
0
    public static void UpdateScreenCap(xARMScreenCap screenCap)
    {
        ResizeGameView(screenCap.Resolution);
        // run custom code
        if (OnPreScreenCapUpdate != null)
        {
            OnPreScreenCapUpdate();
        }

        xARMManager.ScreenCapUpdateInProgress = true;

        // wait x frames to ensure correct results with other (lazy) plugins
        if (xARMManager.CurrEditorMode == EditorMode.Play)         // don't wait in Play mode
        {
            Proxy.StartWaitXFramesCoroutine(screenCap, 0);
        }
        else
        {
            Proxy.StartWaitXFramesCoroutine(screenCap, xARMManager.Config.FramesToWait);
        }
    }
示例#20
0
    private static void DrawGallery()
    {
        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();

        for (int x = 0; x < activeScreenCaps.Count; x++)
        {
            xARMScreenCap currScreenCap = activeScreenCaps[x];

            // start new row
            if (x % xARMManager.Config.GalleryScreenCapsPerRow == 0)
            {
                EditorGUILayout.EndHorizontal();
                EditorGUILayout.BeginHorizontal();
            }

            DrawScreenCap(currScreenCap, x);
        }

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();
    }
示例#21
0
 // coroutine to wait a few frames between resolution change and SC update
 public void StartWaitXFramesCoroutine(xARMScreenCap screenCap, int frameCount)
 {
     StartCoroutine(WaitXFrames(screenCap, frameCount));
 }
示例#22
0
    void Update()
    {
#if UNITY_3_3 || UNITY_3_4 || UNITY_3_5
        // trace Game View position
        xARMManager.SaveGameViewPosition();
#else
        // do tracing via Proxy.Update()
#endif

        // ensures a xARM Proxy exists
        xARMManager.CreateProxyGO();

        // finalize SC update
        if (xARMManager.PreviewIsUpdating && !xARMManager.ScreenCapUpdateInProgress)
        {
            xARMManager.PreviewIsUpdating = false;
            xARMManager.FinalizeScreenCapUpdate();
        }

        // update SC if auto update is enabled or Update1x was clicked
        if (((xARMManager.Config.PreviewAutoUpdateInEditorMode && xARMManager.CurrEditorMode == EditorMode.Edit) ||      // Edit
             (xARMManager.Config.PreviewAutoUpdateInPauseMode && xARMManager.CurrEditorMode == EditorMode.Pause) ||      // Pause
             (xARMManager.Config.PreviewAutoUpdateInPlayMode && xARMManager.CurrEditorMode == EditorMode.Play) ||        // Play
             updateOnce) &&
            !xARMManager.GalleryIsUpdating &&
            !xARMManager.ScreenCapUpdateInProgress)
        {
            // limit SC updates
            if (!updateOnce && xARMManager.CurrEditorMode == EditorMode.Edit)             // limit auto update in Edit mode
            {
                updateInterval = 1f / xARMManager.Config.PreviewUpdateIntervalLimitEdit;
            }
            else if (!updateOnce && xARMManager.CurrEditorMode == EditorMode.Play)               // limit auto update in Play mode
            {
                updateInterval = 1f / xARMManager.Config.PreviewUpdateIntervalLimitPlay;
            }
            else
            {
                updateInterval = 0f;                 // do not limit update interval
            }

            if (EditorApplication.timeSinceStartup > lastUpdateTime + updateInterval)             // limit updates per sec
            {
                lastUpdateTime = EditorApplication.timeSinceStartup;

                if (SelectedScreenCap is xARMScreenCap && xARMManager.ProxyGO && !xARMManager.GalleryIsUpdating)
                {
                    xARMScreenCap currScreenCap = SelectedScreenCap;

                    // update screencap only if it's outdated (try one time) OR update1x is clicked
                    if (xARMManager.IsToUpdate(currScreenCap) || updateOnce)
                    {
                        // run custom code
                        if (xARMManager.PreviewIsUpdating == false && xARMManager.OnStartScreenCapUpdate != null)
                        {
                            xARMManager.OnStartScreenCapUpdate();
                        }

                        xARMManager.PreviewIsUpdating = true;
                        xARMManager.UpdateScreenCap(currScreenCap);
                        updateOnce = false;
                    }
                }
            }
        }

        // ensure a next frame while waiting for one
        if (xARMManager.ScreenCapUpdateInProgress && xARMManager.PreviewIsUpdating)         // while SC update
        {
            xARMManager.EnsureNextFrame();
        }
        else if (postGameViewResizeFramesToGo > 0)         // after GV's resolution is changed by selection in Preview
        {
            xARMManager.EnsureNextFrame();
            postGameViewResizeFramesToGo--;
        }

        if (activeScreenCaps.Count == 0)
        {
            InfoBoxText = "No ScreenCaps active. Open xARM Options to activate target Aspect Ratios and Resolutions.";
        }
        else
        {
            InfoBoxText = "";
        }

        // resize Game View to new default resolution
        if (resizeGameViewToNewDefault)
        {
            resizeGameViewToNewDefault = false;

            xARMManager.ResizeGameViewToDefault();
            postGameViewResizeFramesToGo = xARMManager.Config.FramesToWait;
        }

        // repaint window
        if (RepaintNextUpdate)
        {
            myWindow.Repaint();
            RepaintNextUpdate = false;
        }
    }
示例#23
0
 public void StartUpdateScreenCapCoroutine(xARMScreenCap screenCapToUpdate)
 {
     StartCoroutine(UpdateScreenCapCoroutine(screenCapToUpdate));
 }
示例#24
0
    // update one ScreenCap per Update()
    void Update()
    {
#if UNITY_3_3 || UNITY_3_4 || UNITY_3_5
        // trace Game View position
        xARMManager.SaveGameViewPosition();
#else
        // do tracing via Proxy.Update()
#endif

        // ensures a xARM Proxy exists
        xARMManager.CreateProxyGO();

        // finalize SC update (set default GV size etc.)
        if (xARMManager.AllScreenCapsUpdatedRecently() && !xARMManager.FinalizeScreenCapInProgress)
        {
            // reset 1xUpdate
            if (updateOnce)
            {
                screenCapsToUpdateOnce = 0;
                updateOnce             = false;
            }

            xARMManager.GalleryIsUpdating           = false;
            xARMManager.FinalizeScreenCapInProgress = true;
            xARMManager.FinalizeScreenCapUpdate();
        }
        // ensure some frames after default resolution is set
        else if (xARMManager.AllScreenCapsUpdatedRecently() && xARMManager.FinalizeScreenCapInProgress)
        {
            // still frames to go?
            if (postUpdateFramesToGo <= 0)
            {
                xARMManager.SetAllScreenCapsUpdated();
                xARMManager.FinalizeScreenCapInProgress = false;
            }
            else
            {
                xARMManager.EnsureNextFrame();
                postUpdateFramesToGo--;
            }
        }
        // auto update or 1xUpdate
        else if (((xARMManager.Config.GalleryAutoUpdateInEditorMode && xARMManager.CurrEditorMode == EditorMode.Edit) || // Editor mode
                  (xARMManager.Config.GalleryAutoUpdateInPauseMode && xARMManager.CurrEditorMode == EditorMode.Pause) || // Pause mode
                  updateOnce) &&                                                                                         // 1x Update
                 !xARMManager.ScreenCapUpdateInProgress)
        {                                                                                                                // update ScreenCap
            // limit SC-block updates
            if (!updateOnce && !xARMManager.GalleryIsUpdating && xARMManager.CurrEditorMode == EditorMode.Edit)          // limit auto update in Edit mode (only for SC-blocks)
            {
                updateInterval = 1f / xARMManager.Config.GalleryUpdateIntervalLimitEdit;
            }
            else
            {
                updateInterval = 0f;                 // do not limit update interval
            }

            if (EditorApplication.timeSinceStartup > lastUpdateTime + updateInterval)             // limit updates per sec
            {
                lastUpdateTime = EditorApplication.timeSinceStartup;

                // cache list
                activeScreenCaps = xARMManager.ActiveScreenCaps;

                // execute update?
                if (activeScreenCaps.Count != 0 && xARMManager.ProxyGO && !xARMManager.PreviewIsUpdating && !xARMManager.GameViewHasFocus)
                {
                    // find next screenCap to update
                    if (currScreenCapIndex >= activeScreenCaps.Count)
                    {
                        currScreenCapIndex = 0;
                    }
                    xARMScreenCap currScreenCap = activeScreenCaps[currScreenCapIndex];

                    // update screencap only if it's outdated (try one time) OR update1x is clicked
                    if (xARMManager.IsToUpdate(currScreenCap) || updateOnce)
                    {
                        xARMManager.GalleryIsUpdating = true;
                        xARMManager.UpdateScreenCap(currScreenCap);

                        currScreenCapIndex++;

                        // decrease Update1x-to-go count
                        if (updateOnce && screenCapsToUpdateOnce > 0)
                        {
                            screenCapsToUpdateOnce--;
                        }

                        // number os frames to step after all SCs are updated
                        postUpdateFramesToGo = xARMManager.Config.FramesToWait;
                    }
                    else                         // skip SC
                    {
                        currScreenCapIndex++;
                    }
                }
            }
        }

        // ensure a next frame while waiting for one
        if (xARMManager.ScreenCapUpdateInProgress && xARMManager.GalleryIsUpdating)
        {
            xARMManager.EnsureNextFrame();
        }

        if (activeScreenCaps.Count == 0)
        {
            InfoBoxText = "No ScreenCaps active. Open xARM Options to activate target Aspect Ratios and Resolutions.";
        }
        else
        {
            InfoBoxText = "";
        }

        // repaint window
        if (repaintNextUpdate)
        {
            myWindow.Repaint();
            repaintNextUpdate = false;
        }
    }
示例#25
0
    private static void DrawScreenCap(xARMScreenCap screenCap, int screenCapIndex)
    {
        Rect  screenCapRect, screenCapBox;
        float screenCapPXOnScreen;         // SC px width

        // create Box and Rect
        if (xARMManager.Config.UseFixedScreenCapSize)
        {
            screenCapBox        = EditorGUILayout.BeginVertical("box", GUILayout.Width(xARMManager.Config.FixedScreenCapSize.x), GUILayout.Height(xARMManager.Config.FixedScreenCapSize.y));
            screenCapRect       = GUILayoutUtility.GetRect(xARMManager.Config.FixedScreenCapSize.x, xARMManager.Config.FixedScreenCapSize.y);
            screenCapPXOnScreen = xARMManager.Config.FixedScreenCapSize.x;
        }
        else
        {
            screenCapBox        = EditorGUILayout.BeginVertical("box");
            screenCapRect       = GUILayoutUtility.GetAspectRect(screenCap.Aspect, GUILayout.MinWidth(screenCapMinWidth), GUILayout.MinHeight(screenCapMinHeight));
            screenCapPXOnScreen = myWindow.position.width / xARMManager.Config.GalleryScreenCapsPerRow;             // estimate SC width
        }

        // draw SC
        if (screenCap.UpdatedSuccessful)
        {
#if UNITY_3_3 || UNITY_3_4 || UNITY_3_5
            // standard draw (with Play mode tint)
            GUI.DrawTexture(screenCapRect, screenCap.Texture, ScaleMode.ScaleToFit);
#else
            // draw ScreenCap in prepared rect (use EditorGUI.DrawTextureTransparent to draw it without Play mode tint)
            EditorGUI.DrawTextureTransparent(screenCapRect, screenCap.Texture, ScaleMode.ScaleToFit);
#endif

            // select SC in xARM Preview on click
            if (screenCapBox.Contains(Event.current.mousePosition))
            {
                if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
                {
                    xARMPreviewWindow.ChangeActiveScreenCap(screenCapIndex);
                }
            }
        }
        else
        {
#if UNITY_3_3 || UNITY_3_4
            GUILayout.Label("ScreenCap could not been updated");
#else
            EditorGUILayout.HelpBox("ScreenCap could not been updated", MessageType.Warning, true);              // Unity 3.3 Error
#endif
        }

        GUILayout.Space(2);

        // description
        EditorGUILayout.BeginHorizontal();
        if (screenCap.IsLandscape)
        {
            GUILayout.Label(screenCap.Name + " " + screenCap.Diagonal + charInch + " " + screenCap.DPILabel + " (" + screenCap.AspectLabel + ")" + "\n" +
                            screenCap.Resolution.x + "x" + screenCap.Resolution.y + "px (" + screenCap.ResolutionLabel + " " + charLandscape + ")", labelStyle);
        }
        else
        {
            GUILayout.Label(screenCap.Name + " " + screenCap.Diagonal + charInch + " " + screenCap.DPILabel + " (" + screenCap.AspectLabel + ")" + "\n" +
                            screenCap.Resolution.x + "x" + screenCap.Resolution.y + "px (" + screenCap.ResolutionLabel + " " + charPortrait + ")", labelStyle);
        }

        // scale ratio
        if (xARMManager.Config.EditorDPI > 0)
        {
            float scaleRatioPhySizeInch    = xARMManager.Config.ScaleRatioInch;
            float scaleRatioPhySizePX      = xARMManager.Config.EditorDPI * scaleRatioPhySizeInch;                  // phy size of fingerprint with Editor DPI
            float screenCapPhySizeOnScreen = screenCap.Resolution.x * xARMManager.Config.EditorDPI / screenCap.DPI; // phy size of SC with Editor DPI
            if (Event.current.type.Equals(EventType.Repaint))
            {
                screenCapPXOnScreen = screenCapRect.width;                                                         // get precise SC width
            }
            float scaleRatioPX = scaleRatioPhySizePX * screenCapPXOnScreen / screenCapPhySizeOnScreen;             // px widht/height of fingerprint

            Rect scaleRatioRect = GUILayoutUtility.GetRect(scaleRatioPX, scaleRatioPX, GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(false));
            GUI.DrawTexture(scaleRatioRect, EditorGUIUtility.whiteTexture, ScaleMode.ScaleToFit, false);
        }

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();
    }