Просмотр исходного кода

Add sepia and blur effects

Closes #24
habeebweeb 3 лет назад
Родитель
Сommit
94fc4b53bb

+ 7 - 2
COM3D2.MeidoPhotoStudio.Plugin/Config/MeidoPhotoStudio/Translations/en/translation.ui.json

@@ -126,7 +126,8 @@
     "gravityControlPane": {
         "hairToggle": "Hair",
         "skirtToggle": "Skirt",
-        "globalToggle": "Global"
+        "globalToggle": "Global",
+        "gravityHeader": "Gravity Control"
     },
     "handPane": {
         "header": "Hand Preset",
@@ -195,7 +196,7 @@
         "hohol": "Blush 3"
     },
     "faceSave": {
-        "categoryHeader": "Cateogory",
+        "categoryHeader": "Category",
         "nameHeader": "Name",
         "saveButton": "Add",
         "deleteButton": "D"
@@ -301,6 +302,10 @@
         "toggle": "Sepia",
         "blur": "Blur"
     },
+    "otherEffectsPane": {
+        "sepiaToggle": "Sepia",
+        "blurSlider": "Blur"
+    },
     "background2Window": {
         "envButton": "Environments",
         "itemLabel": "Item",

+ 64 - 0
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/GUI/Panes/BackgroundWindowPanes/EffectsPanes/OtherEffectsPane.cs

@@ -0,0 +1,64 @@
+using UnityEngine;
+
+namespace COM3D2.MeidoPhotoStudio.Plugin
+{
+    internal class OtherEffectsPane : BasePane
+    {
+        private readonly EffectManager effectManager;
+        private readonly SepiaToneEffectManger sepiaToneEffectManger;
+        private readonly BlurEffectManager blurEffectManager;
+        private readonly Toggle sepiaToggle;
+        private readonly Slider blurSlider;
+
+        public OtherEffectsPane(EffectManager effectManager)
+        {
+            this.effectManager = effectManager;
+
+            sepiaToneEffectManger = this.effectManager.Get<SepiaToneEffectManger>();
+            blurEffectManager = this.effectManager.Get<BlurEffectManager>();
+
+            sepiaToggle = new Toggle(Translation.Get("otherEffectsPane", "sepiaToggle"));
+            sepiaToggle.ControlEvent += (s, a) =>
+            {
+                if (updating) return;
+                sepiaToneEffectManger.SetEffectActive(sepiaToggle.Value);
+            };
+
+            blurSlider = new Slider(Translation.Get("otherEffectsPane", "blurSlider"), 0f, 18f);
+            blurSlider.ControlEvent += (s, a) =>
+            {
+                float value = blurSlider.Value;
+                if (!blurEffectManager.Active && value > 0f) blurEffectManager.SetEffectActive(true);
+                else if (blurEffectManager.Active && value == 0f) blurEffectManager.SetEffectActive(false);
+
+                if (blurEffectManager.Active) blurEffectManager.BlurSize = blurSlider.Value;
+            };
+        }
+
+        protected override void ReloadTranslation()
+        {
+            sepiaToggle.Label = Translation.Get("otherEffectsPane", "sepiaToggle");
+            blurSlider.Label = Translation.Get("otherEffectsPane", "blurSlider");
+        }
+
+        public override void Draw()
+        {
+            GUILayout.BeginHorizontal();
+            sepiaToggle.Draw();
+            blurSlider.Draw();
+            GUILayout.EndHorizontal();
+        }
+
+        public override void UpdatePane()
+        {
+            if (sepiaToneEffectManger.Ready)
+            {
+                updating = true;
+                sepiaToggle.Value = sepiaToneEffectManger.Active;
+                updating = false;
+            }
+
+            if (blurEffectManager.Ready) blurSlider.Value = blurEffectManager.BlurSize;
+        }
+    }
+}

+ 6 - 0
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/Managers/EffectManager.cs

@@ -46,6 +46,12 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
                     case FogEffectManager.header:
                         Get<FogEffectManager>().Deserialize(binaryReader);
                         break;
+                    case SepiaToneEffectManger.header:
+                        Get<SepiaToneEffectManger>().Deserialize(binaryReader);
+                        break;
+                    case BlurEffectManager.header:
+                        Get<BlurEffectManager>().Deserialize(binaryReader);
+                        break;
                 }
             }
         }

+ 86 - 0
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/Managers/EffectManagers/BlurEffectManager.cs

@@ -0,0 +1,86 @@
+using System.IO;
+using UnityEngine;
+
+namespace COM3D2.MeidoPhotoStudio.Plugin
+{
+    internal class BlurEffectManager : IEffectManager
+    {
+        public const string header = "EFFECT_BLUR";
+        private Blur Blur { get; set; }
+        public bool Ready { get; private set; }
+        public bool Active { get; private set; }
+        private float initialBlurSize;
+        private int initialBlurIterations;
+        private int initialDownsample;
+        private float blurSize;
+        public float BlurSize
+        {
+            get => blurSize;
+            set
+            {
+                blurSize = value;
+                Blur.blurSize = blurSize / 10f;
+                if (blurSize >= 3f)
+                {
+                    Blur.blurSize -= 0.3f;
+                    Blur.blurIterations = 1;
+                    Blur.downsample = 1;
+                }
+                else
+                {
+                    Blur.blurIterations = 0;
+                    Blur.downsample = 0;
+                }
+            }
+        }
+
+        public void Activate()
+        {
+            if (Blur == null)
+            {
+                Ready = true;
+                Blur = GameMain.Instance.MainCamera.GetComponent<Blur>();
+                initialBlurSize = Blur.blurSize;
+                initialBlurIterations = Blur.blurIterations;
+                initialDownsample = Blur.downsample;
+            }
+            SetEffectActive(false);
+        }
+
+        public void Deactivate()
+        {
+            BlurSize = 0f;
+            Reset();
+            Blur.enabled = false;
+            Active = false;
+        }
+
+        public void Deserialize(BinaryReader binaryReader)
+        {
+            BlurSize = binaryReader.ReadSingle();
+            SetEffectActive(binaryReader.ReadBoolean());
+        }
+
+        public void Serialize(BinaryWriter binaryWriter)
+        {
+            binaryWriter.Write(header);
+            binaryWriter.Write(BlurSize);
+            binaryWriter.Write(Active);
+        }
+
+        public void SetEffectActive(bool active)
+        {
+            if (Blur.enabled = Active = active) BlurSize = BlurSize;
+            else Reset();
+        }
+
+        public void Reset()
+        {
+            Blur.blurSize = initialBlurSize;
+            Blur.blurIterations = initialBlurIterations;
+            Blur.downsample = initialDownsample;
+        }
+
+        public void Update() { }
+    }
+}

+ 41 - 0
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/Managers/EffectManagers/SepiaToneEffectManager.cs

@@ -0,0 +1,41 @@
+using System.IO;
+using UnityEngine;
+
+namespace COM3D2.MeidoPhotoStudio.Plugin
+{
+    internal class SepiaToneEffectManger : IEffectManager
+    {
+        public const string header = "EFFECT_SEPIA";
+        private SepiaToneEffect SepiaTone { get; set; }
+        public bool Ready { get; private set; }
+        public bool Active { get; private set; }
+
+        public void Activate()
+        {
+            if (SepiaTone == null)
+            {
+                Ready = true;
+                SepiaTone = GameMain.Instance.MainCamera.GetOrAddComponent<SepiaToneEffect>();
+
+                if (SepiaTone.shader == null) SepiaTone.shader = Shader.Find("Hidden/Sepiatone Effect");
+            }
+            SetEffectActive(false);
+        }
+
+        public void Deactivate() => SetEffectActive(false);
+
+        public void Deserialize(BinaryReader binaryReader) => SetEffectActive(binaryReader.ReadBoolean());
+
+        public void Serialize(BinaryWriter binaryWriter)
+        {
+            binaryWriter.Write(header);
+            binaryWriter.Write(Active);
+        }
+
+        public void SetEffectActive(bool active) => SepiaTone.enabled = Active = active;
+
+        public void Reset() { }
+
+        public void Update() { }
+    }
+}

+ 2 - 0
COM3D2.MeidoPhotoStudio.Plugin/MeidoPhotoStudio/MeidoPhotoStudio.cs

@@ -357,6 +357,8 @@ namespace COM3D2.MeidoPhotoStudio.Plugin
             effectManager.AddManager<DepthOfFieldEffectManager>();
             effectManager.AddManager<FogEffectManager>();
             effectManager.AddManager<VignetteEffectManager>();
+            effectManager.AddManager<SepiaToneEffectManger>();
+            effectManager.AddManager<BlurEffectManager>();
 
             meidoManager.BeginCallMeidos += (s, a) => uiActive = false;
             meidoManager.EndCallMeidos += (s, a) => uiActive = true;