123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- using alphaShot;
- using BepInEx;
- using BepInEx.Common;
- using Illusion.Game;
- using System;
- using System.Collections;
- using System.IO;
- using UnityEngine;
- namespace Screencap
- {
- public class ScreenshotManager : BaseUnityPlugin
- {
- public override string ID => "com.bepis.bepinex.screenshotmanager";
- public override string Name => "Screenshot Manager";
- public override Version Version => new Version("2.0");
- Event ScreenKeyEvent = Event.KeyboardEvent("f9");
- Event CharacterKeyEvent = Event.KeyboardEvent("f11");
- Event CharacterSettingsKeyEvent = Event.KeyboardEvent("#f11");
- private string screenshotDir = Utility.CombinePaths(Utility.ExecutingDirectory, "UserData", "cap");
- #region Config properties
- private int ResolutionX
- {
- get => int.Parse(BepInEx.Config.GetEntry("screenshotrenderer-resolution-x", "1024"));
- set => BepInEx.Config.SetEntry("screenshotrenderer-resolution-x", value.ToString());
- }
- private int ResolutionY
- {
- get => int.Parse(BepInEx.Config.GetEntry("screenshotrenderer-resolution-y", "1024"));
- set => BepInEx.Config.SetEntry("screenshotrenderer-resolution-y", value.ToString());
- }
-
- private int AntiAliasing
- {
- get => int.Parse(BepInEx.Config.GetEntry("screenshotrenderer-antialiasing", "4"));
- set => BepInEx.Config.SetEntry("screenshotrenderer-antialiasing", value.ToString());
- }
- private int DownscalingRate
- {
- get => int.Parse(BepInEx.Config.GetEntry("screenshotrenderer-downscalerate", "1"));
- set => BepInEx.Config.SetEntry("screenshotrenderer-downscalerate", value.ToString());
- }
- private int RenderMethod
- {
- get => int.Parse(BepInEx.Config.GetEntry("screenshotrenderer-rendermethod", "1"));
- set => BepInEx.Config.SetEntry("screenshotrenderer-rendermethod", value.ToString());
- }
- #endregion
- void Awake()
- {
- if (!Directory.Exists(screenshotDir))
- Directory.CreateDirectory(screenshotDir);
- }
- void Update()
- {
- if (UnityEngine.Event.current.Equals(CharacterSettingsKeyEvent))
- {
- showingUI = !showingUI;
- }
- else if (UnityEngine.Event.current.Equals(ScreenKeyEvent))
- {
- string filename = Path.Combine(screenshotDir, $"Koikatsu -{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.png");
- StartCoroutine(TakeScreenshot(filename));
- }
- else if (UnityEngine.Event.current.Equals(CharacterKeyEvent))
- {
- string filename = Path.Combine(screenshotDir, $"Koikatsu Char-{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.png");
- TakeCharScreenshot(filename);
- }
- }
- IEnumerator TakeScreenshot(string filename)
- {
- Application.CaptureScreenshot(filename);
- Illusion.Game.Utils.Sound.Play(SystemSE.photo);
- while (!File.Exists(filename))
- yield return new WaitForSeconds(0.01f);
- BepInLogger.Log($"Screenshot saved to {filename}", true);
- }
- void TakeCharScreenshot(string filename)
- {
- Camera.main.backgroundColor = Color.clear;
- switch (RenderMethod)
- {
- case 0:
- default:
- File.WriteAllBytes(filename, LegacyRenderer.RenderCamera(ResolutionX, ResolutionY, DownscalingRate, AntiAliasing));
- break;
-
-
-
- }
- Illusion.Game.Utils.Sound.Play(SystemSE.photo);
- BepInLogger.Log($"Character screenshot saved to {filename}", true);
- }
- #region UI
- private Rect UI = new Rect(20, 20, 160, 250);
- private bool showingUI = false;
- void OnGUI()
- {
- if (showingUI)
- UI = GUI.Window(Name.GetHashCode() + 0, UI, WindowFunction, "Rendering settings");
- }
- void WindowFunction(int windowID)
- {
- GUI.Label(new Rect(0, 20, 160, 20), "Output resolution", new GUIStyle
- {
- alignment = TextAnchor.MiddleCenter,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- GUI.Label(new Rect(0, 40, 160, 20), "x", new GUIStyle
- {
- alignment = TextAnchor.MiddleCenter,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- string resX = GUI.TextField(new Rect(10, 40, 60, 20), ResolutionX.ToString());
- string resY = GUI.TextField(new Rect(90, 40, 60, 20), ResolutionY.ToString());
- bool screenSize = GUI.Button(new Rect(10, 65, 140, 20), "Set to screen size");
- GUI.Label(new Rect(0, 90, 160, 20), "Downscaling rate", new GUIStyle
- {
- alignment = TextAnchor.MiddleCenter,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- int downscale = (int)Math.Round(GUI.HorizontalSlider(new Rect(10, 113, 120, 20), DownscalingRate, 1, 4));
- GUI.Label(new Rect(0, 110, 150, 20), $"{downscale}x", new GUIStyle
- {
- alignment = TextAnchor.UpperRight,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- GUI.Label(new Rect(0, 130, 160, 20), "Antialiasing", new GUIStyle
- {
- alignment = TextAnchor.MiddleCenter,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- int antia = (int)Math.Round(GUI.HorizontalSlider(new Rect(10, 153, 120, 20), AntiAliasing, 1, 16));
- GUI.Label(new Rect(0, 150, 154, 20), $"{antia}x", new GUIStyle
- {
- alignment = TextAnchor.UpperRight,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- GUI.Label(new Rect(0, 170, 160, 20), "Render method", new GUIStyle
- {
- alignment = TextAnchor.MiddleCenter,
- normal = new GUIStyleState
- {
- textColor = Color.white
- }
- });
- int renderMethod = GUI.SelectionGrid(new Rect(10, 190, 140, 50), RenderMethod, new[] { "Legacy", "AlphaShot" }, 1);
- if (GUI.changed)
- {
- BepInEx.Config.SaveOnConfigSet = false;
- if (int.TryParse(resX, out int x))
- ResolutionX = Mathf.Clamp(x, 2, 4096);
- if (int.TryParse(resY, out int y))
- ResolutionY = Mathf.Clamp(y, 2, 4096);
- if (screenSize)
- {
- ResolutionX = Screen.width;
- ResolutionY = Screen.height;
- }
- DownscalingRate = downscale;
- AntiAliasing = antia;
- RenderMethod = renderMethod;
- BepInEx.Config.SaveOnConfigSet = true;
- BepInEx.Config.SaveConfig();
- }
- GUI.DragWindow();
- }
- #endregion
- }
- }
|