Пример #1
0
        public static IEnumerable <TreeNodeObject> EnumerateTreeNodeObjects(TreeNodeObject root = null)
        {
            var roots = ListPool <TreeNodeObject> .Get();

            if (root != null)
            {
                roots.Add(root);
            }
            else
            {
                root = StudioAPI.GetSelectedObjects().FirstOrDefault()?.treeNodeObject;
                if (root != null)
                {
                    roots.AddRange(root.GetTreeNodeCtrl().GetTreeNodeObjects());
                }
            }

            foreach (var entry in roots)
            {
                yield return(entry);

                foreach (var tnObj in entry.child.SelectMany(EnumerateTreeNodeObjects))
                {
                    yield return(tnObj);
                }
            }

            ListPool <TreeNodeObject> .Release(roots);
        }
Пример #2
0
        private static void RegisterStudioControls()
        {
            CurrentStateCategoryToggle CreateToggle(string name, int textureCount, Action <SkinEffectsController, int> set, Func <SkinEffectsController, int> get)
            {
                var tgl = new CurrentStateCategoryToggle(name,
                                                         Mathf.Min(4, textureCount + 1),
                                                         c => RescaleStudioLevel(get(c.charInfo.GetComponent <SkinEffectsController>()), textureCount, 3));

                tgl.Value.Subscribe(Observer.Create((int x) =>
                {
                    foreach (var controller in StudioAPI.GetSelectedControllers <SkinEffectsController>())
                    {
                        set(controller, RescaleStudioLevel(x, tgl.ToggleCount - 1, textureCount));
                    }
                }));

                return(tgl);
            }

            var sweatTgl = CreateToggle("Sweat", TextureLoader.WetTexturesFaceCount, (controller, i) => controller.SweatLevel = i, controller => controller.SweatLevel);
            var tearsTgl = CreateToggle("Tears", TextureLoader.TearTexturesCount, (controller, i) => controller.TearLevel = i, controller => controller.TearLevel);
            var droolTgl = CreateToggle("Drool", TextureLoader.DroolTexturesCount, (controller, i) => controller.DroolLevel = i, controller => controller.DroolLevel);
            var cumTgl   = CreateToggle("Bukkake", TextureLoader.CumTexturesCount, (controller, i) => controller.BukkakeLevel = i, controller => controller.BukkakeLevel);
            var bldTgl   = CreateToggle("Virgin blood", TextureLoader.BldTexturesCount, (controller, i) => controller.BloodLevel = i, controller => controller.BloodLevel);

            StudioAPI.GetOrCreateCurrentStateCategory("Additional skin effects").AddControls(sweatTgl, tearsTgl, droolTgl, cumTgl, bldTgl);
        }
        private void Start()
        {
#if !EC
            if (StudioAPI.InsideStudio)
            {
                enabled = false;
                var cat = StudioAPI.GetOrCreateCurrentStateCategory("Overlays");
                cat.AddControl(new CurrentStateCategorySwitch("Skin overlays",
                                                              c => c.charInfo.GetComponent <KoiSkinOverlayController>().EnableInStudioSkin)).Value.Subscribe(
                    v => StudioAPI.GetSelectedControllers <KoiSkinOverlayController>().Do(c =>
                {
                    if (c.EnableInStudioSkin != v)
                    {
                        c.EnableInStudioSkin = v;
                        c.UpdateTexture(TexType.Unknown);
                    }
                }));
                cat.AddControl(new CurrentStateCategorySwitch("Eye overlays",
                                                              c => c.charInfo.GetComponent <KoiSkinOverlayController>().EnableInStudioIris)).Value.Subscribe(
                    v => StudioAPI.GetSelectedControllers <KoiSkinOverlayController>().Do(c =>
                {
                    if (c.EnableInStudioIris != v)
                    {
                        c.EnableInStudioIris = v;
                        c.UpdateTexture(TexType.EyeUnder);
                    }
                }));
                return;
            }
#endif

            MakerAPI.RegisterCustomSubCategories += RegisterCustomSubCategories;
            MakerAPI.MakerExiting          += MakerExiting;
            CharacterApi.CharacterReloaded += (sender, args) => OnChaFileLoaded();
        }
Пример #4
0
        private IEnumerable <TreeNodeObject> EnumerateTreeNodeObjects(TreeNodeObject root = null)
        {
            var roots = new List <TreeNodeObject>();

            if (root != null)
            {
                roots.Add(root);
            }
            else
            {
                root = StudioAPI.GetSelectedObjects().FirstOrDefault()?.treeNodeObject;
                if (root != null)
                {
                    roots.AddRange(root.GetTreeNodeCtrl().GetTreeNodeObjects());
                }
            }

            foreach (var entry in roots)
            {
                yield return(entry);

                foreach (var tnObj in entry.child.SelectMany(EnumerateTreeNodeObjects))
                {
                    yield return(tnObj);
                }
            }
            roots.Clear();
        }
Пример #5
0
        private void SelectCharasById(CharaId matchId)
        {
            var selected      = 0;
            var origCharCount = StudioAPI.GetSelectedCharacters().Count();
            var origObjCount  = StudioAPI.GetSelectedObjects().Count() - origCharCount;

            foreach (var objectCtrlInfo in EnumerateObjects())
            {
                Logger.DebugLogDebug($"SelectCharasById: {objectCtrlInfo}");
                if (objectCtrlInfo is OCIChar ociChar)
                {
                    if (DoesCharaMatch(matchId, ociChar))
                    {
                        ociChar.MultiSelectInWorkarea();
                        selected++;
                    }
                    else
                    {
                        if (ociChar.IsSelectedInWorkarea())
                        {
                            ociChar.UnselectInWorkarea();
                        }
                    }
                }
                else
                {
                    objectCtrlInfo.UnselectInWorkarea();
                }
            }

            Logger.Log(BepInLogLevel.Info | BepInLogLevel.Message,
                       $"characters selected: {selected} ({selected - origCharCount} new selections, {origObjCount} non-characters unselected)");
            GeBoAPI.Instance.PlayNotificationSound(NotificationSound.Success);
        }
Пример #6
0
        private static void CreateStudioControls()
        {
            var currentStateCategory = StudioAPI.GetOrCreateCurrentStateCategory(null);

            var list = CrestInterfaceList.Create(false, false);

            int ReadValue(OCIChar c)
            {
                var crest = c.GetChaControl().GetComponent <LewdCrestXController>().CurrentCrest;

                return(list.GetIndex(crest));
            }

            void SetValue(int i)
            {
                var crest = list.GetType(i);

                foreach (var controller in StudioAPI.GetSelectedControllers <LewdCrestXController>())
                {
                    controller.CurrentCrest = crest;
                }
            }

            currentStateCategory.AddControl(new CurrentStateCategoryDropdown("Lewd Crest", list.GetInterfaceNames(), ReadValue)).Value.Subscribe(SetValue);

            currentStateCategory.AddControl(new CurrentStateCategorySwitch("Lewd Crest visible",
                                                                           c => c.GetChaControl().GetComponent <LewdCrestXController>().HideCrestGraphic)).Value.Subscribe(
                b => StudioAPI.GetSelectedControllers <LewdCrestXController>().Do(ctrl => ctrl.HideCrestGraphic = b));
        }
Пример #7
0
        private void InitStudioUI(Scene scene, LoadSceneMode loadSceneMode)
        {
            if (scene.name != "Studio")
            {
                return;
            }
            SceneManager.sceneLoaded -= InitStudioUI;

            var dropdownForegroundEyebrow = GameObject.Find("StudioScene").transform.Find("Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/05_Etc/Eyebrows Draw/Dropdown").GetComponent <Dropdown>();

            dropdownForegroundEyebrow.onValueChanged.AddListener(value =>
            {
                var characters = StudioAPI.GetSelectedCharacters();
                foreach (var character in characters)
                {
                    SetEyebrows(character.charInfo, (byte)value);
                }
            });

            var dropdownForegroundEyes = GameObject.Find("StudioScene").transform.Find("Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/05_Etc/Eyes Draw/Dropdown").GetComponent <Dropdown>();

            dropdownForegroundEyes.onValueChanged.AddListener(value =>
            {
                var characters = StudioAPI.GetSelectedCharacters();
                foreach (var character in characters)
                {
                    SetEyeliners(character.charInfo, (byte)value);
                }
            });
        }
Пример #8
0
        private void Awake()
        {
            var insideStudio = Application.productName == "StudioNEOV2";

            MakerAPI.Init(insideStudio);
            StudioAPI.Init(insideStudio);
            CharacterApi.Init();
        }
Пример #9
0
            private static void CreateMenuEntry()
            {
                GameObject listmenu  = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/Viewport/Content");
                GameObject fkButton  = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/Viewport/Content/FK");
                var        newSelect = Instantiate(fkButton, listmenu.transform, true);

                newSelect.name = "FK & IK";
                TextMeshProUGUI tmp = newSelect.transform.GetChild(0).GetComponentInChildren(typeof(TextMeshProUGUI)) as TextMeshProUGUI;

                tmp.text = "FK & IK";

                Button[] buttons = listmenu.GetComponentsInChildren <Button>();

                GameObject originalPanel = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic/00_FK");
                GameObject kineMenu      = GameObject.Find("StudioScene/Canvas Main Menu/02_Manipulate/00_Chara/02_Kinematic");

                FKIKPanel = Instantiate(originalPanel, kineMenu.transform, true);

                RectTransform rect = FKIKPanel.GetComponent <RectTransform>();

                rect.sizeDelta = new Vector2(rect.sizeDelta.x, 395);

                Button fkikSelectButton = newSelect.GetComponent <Button>();

                foreach (Button button in buttons)
                {
                    button.onClick.AddListener(delegate()
                    {
                        FKIKPanel.SetActive(false);
                        fkikSelectButton.image.color = Color.white;
                    });
                }

                fkikSelectButton.onClick.RemoveAllListeners();
                fkikSelectButton.onClick.AddListener(delegate()
                {
                    foreach (Transform child in kineMenu.transform)
                    {
                        if (child.name != "Viewport" && child.name != "Scrollbar Vertical")
                        {
                            child.gameObject.SetActive(false);
                        }
                    }
                    foreach (Button button in buttons)
                    {
                        button.image.color = Color.white;
                    }
                    FKIKPanel.SetActive(true);
                    fkikSelectButton.image.color = Color.green;
                    Traverse.Create(FindObjectOfType <MPCharCtrl>()).Field("kinematic").SetValue(-1);
                    foreach (OCIChar ociChar in StudioAPI.GetSelectedCharacters())
                    {
                        OverrideEvents    = true;
                        ActiveButton.isOn = ociChar.oiCharInfo.enableIK && ociChar.oiCharInfo.enableFK;
                        break;
                    }
                });
            }
Пример #10
0
        private void Awake()
        {
            var insideStudio = Application.productName.StartsWith("PlayHomeStudio");

            //todo implement
            MakerAPI.Init(insideStudio);
            StudioAPI.Init(insideStudio);
            CharacterApi.Init();
        }
Пример #11
0
        private void Awake()
        {
            var insideStudio = Application.productName.StartsWith("PlayHomeStudio");

            MakerAPI.Init(insideStudio);
            StudioAPI.Init(insideStudio);
            CharacterApi.Init();
            AccessoriesApi.Init();
        }
Пример #12
0
        private void Awake()
        {
            BaseAwake();

            var insideStudio = Application.productName == "CharaStudio";

            MakerAPI.Init(insideStudio);
            StudioAPI.Init(insideStudio);
            CharacterApi.Init();
            GameAPI.Init(insideStudio);
        }
Пример #13
0
            internal static void RegisterStudioControls()
            {
                if (!Running)
                {
                    return;
                }

                Loaded = true;

                CurrentStateCategorySwitch StudioToggleEnable = new CurrentStateCategorySwitch("Enable", OCIChar => (bool)GetController(OCIChar)?.FunctionEnable);

                StudioToggleEnable.Value.Subscribe(_value =>
                {
                    CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault();
                    if (_pluginCtrl == null)
                    {
                        return;
                    }
                    _pluginCtrl.FunctionEnable = _value;
                });
                StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioToggleEnable);

                CurrentStateCategorySwitch StudioToggleAutoCopyToBlank = new CurrentStateCategorySwitch("Auto Copy To Blank", OCIChar => (bool)GetController(OCIChar)?.AutoCopyToBlank);

                StudioToggleAutoCopyToBlank.Value.Subscribe(_value =>
                {
                    CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault();
                    if (_pluginCtrl == null)
                    {
                        return;
                    }
                    _pluginCtrl.AutoCopyToBlank = _value;
                });
                StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioToggleAutoCopyToBlank);

                List <string> coordinateList = Enum.GetNames(typeof(ChaFileDefine.CoordinateType)).ToList();

                coordinateList.Add("CharaAcc");
                CurrentStateCategoryDropdown StudioDropdownRef = new CurrentStateCategoryDropdown("Referral", coordinateList.ToArray(), OCIChar => (int)GetController(OCIChar)?.ReferralIndex);

                StudioDropdownRef.Value.Subscribe(_value =>
                {
                    CharacterAccessoryController _pluginCtrl = StudioAPI.GetSelectedControllers <CharacterAccessoryController>().FirstOrDefault();
                    if (_pluginCtrl == null)
                    {
                        return;
                    }
                    _pluginCtrl.SetReferralIndex(_value);
                });
                StudioAPI.GetOrCreateCurrentStateCategory("CharaAcc").AddControl(StudioDropdownRef);
            }
Пример #14
0
        private static void RegisterStudioControls()
        {
            var invisibleSwitch = new CurrentStateCategorySwitch("Invisible Body", controller => controller.charInfo.GetComponent <InvisibleBodyCharaController>().Invisible);

            invisibleSwitch.Value.Subscribe(Observer.Create((bool value) =>
            {
                var controller = GetSelectedStudioController();
                if (controller != null)
                {
                    controller.Invisible = value;
                }
            }));

            StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(invisibleSwitch);
        }
Пример #15
0
        private static void RegisterStudioControls()
        {
            var invisibleSwitch = new CurrentStateCategorySwitch("Shaking Eye Highlights", controller => controller.charInfo.GetComponent <EyeShakingController>().EyeShaking);

            invisibleSwitch.Value.Subscribe(Observer.Create((bool value) =>
            {
                var controller = GetSelectedStudioController();
                if (controller != null)
                {
                    controller.EyeShaking = value;
                }
            }));

            StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(invisibleSwitch);
        }
Пример #16
0
        private void Start()
        {
            if (!CheckIncompatibilities())
            {
                return;
            }

            var insideStudio = Application.productName == "CharaStudio";

            MakerAPI.Init(insideStudio);
            StudioAPI.Init(insideStudio);
            StudioSaveLoadApi.Init(insideStudio);
            CharacterApi.Init();
            GameAPI.Init(insideStudio);
        }
        public static void RegisterStudioControls()
        {
            if (!StudioAPI.InsideStudio)
            {
                return;
            }

            StudioCoordinateCurrentStateCategoryDropdown = new CurrentStateCategoryDropdown("Coordinate", CoordinateNames.ToArray(), c => CoordinateIndex());
            StudioCoordinateCurrentStateCategoryDropdown.Value.Subscribe(value =>
            {
                var mpCharCtrol = Object.FindObjectOfType <MPCharCtrl>();
                if (StudioCoordinateDropdown != null)
                {
                    var character = StudioAPI.GetSelectedCharacters().First();

                    //Remove extras
                    if (StudioCoordinateDropdown.options.Count > OriginalCoordinateLength)
                    {
                        StudioCoordinateDropdown.options.RemoveRange(OriginalCoordinateLength, StudioCoordinateDropdown.options.Count - OriginalCoordinateLength);
                    }

                    //Add dropdown options for each additional coodinate
                    if (StudioCoordinateDropdown.options.Count < character.charInfo.chaFile.coordinate.Length)
                    {
                        for (int i = 0; i < (character.charInfo.chaFile.coordinate.Length - OriginalCoordinateLength); i++)
                        {
                            StudioCoordinateDropdown.options.Add(new Dropdown.OptionData(GetCoodinateName(character.charInfo, OriginalCoordinateLength + i)));
                        }
                        StudioCoordinateDropdown.captionText.text = StudioCoordinateDropdown.options[value].text;
                    }
                }

                if (mpCharCtrol != null)
                {
                    mpCharCtrol.stateInfo.OnClickCosType(value);
                }
            });

            int CoordinateIndex()
            {
                var character = StudioAPI.GetSelectedCharacters().First();

                return(character.charInfo.fileStatus.coordinateType);
            }

            StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(StudioCoordinateCurrentStateCategoryDropdown);
        }
Пример #18
0
        private void Awake()
        {
            EnableDebugLoggingSetting = new ConfigWrapper <bool>("EnableDebugLogging", GUID, false);

            if (!CheckIncompatibilities())
            {
                return;
            }

            var insideStudio = Application.productName == "CharaStudio";

            MakerAPI.Init(insideStudio);
            StudioAPI.Init(insideStudio);
            StudioSaveLoadApi.Init(insideStudio);
            CharacterApi.Init();
            GameAPI.Init(insideStudio);
        }
Пример #19
0
        //No studio for EC
        private static void RegisterStudioControls()
        {
            if (!StudioAPI.InsideStudio)
            {
                return;
            }

            var pushupBraToggle = new CurrentStateCategorySwitch("Pushup Bra", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentBraData.EnablePushup);

            StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupBraToggle);
            pushupBraToggle.Value.Subscribe(value =>
            {
                bool first = true;
                foreach (var controller in StudioAPI.GetSelectedControllers <PushupController>())
                {
                    if (first && controller.CurrentBraData.EnablePushup == value)
                    {
                        break;
                    }

                    first = false;
                    controller.CurrentBraData.EnablePushup = value;
                    controller.RecalculateBody();
                }
            });

            var pushupTopToggle = new CurrentStateCategorySwitch("Pushup Top", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentTopData.EnablePushup);

            StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupTopToggle);
            pushupTopToggle.Value.Subscribe(value =>
            {
                bool first = true;
                foreach (var controller in StudioAPI.GetSelectedControllers <PushupController>())
                {
                    if (first && controller.CurrentTopData.EnablePushup == value)
                    {
                        break;
                    }

                    first = false;
                    controller.CurrentTopData.EnablePushup = value;
                    controller.RecalculateBody();
                }
            });
        }
Пример #20
0
        private void CreateInterface()
        {
            if (!StudioAPI.InsideStudio)
            {
                MakerAPI.MakerBaseLoaded += (sender, e) =>
                {
#if KK || KKS
                    var cat = KKABMX.GUI.InterfaceData.BodyGenitals;
#elif AI
                    var cat = MakerConstants.Body.Lower;
#endif

                    e.AddControl(new MakerRadioButtons(cat, this, "Enable crotch bulge", (int)DefaultBulgeState.Value, "Auto", "Always", "Never"))
                    .BindToFunctionController <BulgeController, int>(controller => (int)controller.EnableBulge, (controller, value) => controller.EnableBulge = (BulgeEnableLevel)value);
                    e.AddControl(new MakerText("Auto will enable the bulge only if the character has a shlong (either male or added with UncensorSelector).\nThe effect is applied only when wearing clothes.", cat, this)
                    {
                        TextColor = MakerText.ExplanationGray
                    });
                    e.AddControl(new MakerSlider(cat, "Bulge size", 0, 1, DefaultBulgeSize.Value, this))
                    .BindToFunctionController <BulgeController, float>(controller => controller.BulgeSize, (controller, value) => controller.BulgeSize = value);
                };
            }
            else
            {
                var category = StudioAPI.GetOrCreateCurrentStateCategory(null);
                category.AddControl(new CurrentStateCategoryDropdown(
                                        "Enable crotch bulge", new[] { "Auto", "Always", "Never" },
                                        c => (int)c.charInfo.GetComponent <BulgeController>().EnableBulge)).Value.Subscribe(val =>
                {
                    foreach (var controller in StudioAPI.GetSelectedControllers <BulgeController>())
                    {
                        controller.EnableBulge = (BulgeEnableLevel)val;
                    }
                });
                category.AddControl(new CurrentStateCategorySlider("Bulge size",
                                                                   c => c.charInfo.GetComponent <BulgeController>().BulgeSize)).Value.Subscribe(val =>
                {
                    foreach (var controller in StudioAPI.GetSelectedControllers <BulgeController>())
                    {
                        controller.BulgeSize = val;
                    }
                });
            }
        }
Пример #21
0
 private void Update()
 {
     if (SwapShadersHotkey.Value.IsDown())
     {
         if (MakerAPI.InsideAndLoaded)
         {
             var chaControl = MakerAPI.GetCharacterControl();
             UpdateCharShaders(chaControl);
         }
         else if (StudioAPI.InsideStudio)
         {
             var ociChars = StudioAPI.GetSelectedCharacters();
             foreach (var ociChar in ociChars)
             {
                 UpdateCharShaders(ociChar.GetChaControl());
             }
         }
     }
 }
Пример #22
0
        //No studio for EC
        private static void RegisterStudioControls()
        {
            if (!StudioAPI.InsideStudio)
            {
                return;
            }

            var pushupBraToggle = new CurrentStateCategorySwitch("Pushup Bra", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentBraData.EnablePushup);

            StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupBraToggle);
            pushupBraToggle.Value.Subscribe(value =>
            {
                var controller = GetSelectedController();
                if (controller == null)
                {
                    return;
                }
                if (controller.CurrentBraData.EnablePushup != value)
                {
                    controller.CurrentBraData.EnablePushup = value;
                    controller.RecalculateBody();
                }
            });

            var pushupTopToggle = new CurrentStateCategorySwitch("Pushup Top", ocichar => ocichar.charInfo.GetComponent <PushupController>().CurrentTopData.EnablePushup);

            StudioAPI.GetOrCreateCurrentStateCategory("Pushup").AddControl(pushupTopToggle);
            pushupTopToggle.Value.Subscribe(value =>
            {
                var controller = GetSelectedController();
                if (controller == null)
                {
                    return;
                }
                if (controller.CurrentTopData.EnablePushup != value)
                {
                    controller.CurrentTopData.EnablePushup = value;
                    controller.RecalculateBody();
                }
            });
        }
Пример #23
0
        private static void RegisterStudioControls()
        {
            var invisibleSwitch = new CurrentStateCategorySwitch("Shaking Eye Highlights", controller => controller.charInfo.GetComponent <EyeShakingController>().EyeShaking);

            invisibleSwitch.Value.Subscribe(Observer.Create((bool value) =>
            {
                bool first = true;
                foreach (var controller in StudioAPI.GetSelectedControllers <EyeShakingController>())
                {
                    //Prevent changing other characters when the value did not actually change
                    if (first && controller.EyeShaking == value)
                    {
                        break;
                    }

                    first = false;
                    controller.EyeShaking = value;
                }
            }));

            StudioAPI.GetOrCreateCurrentStateCategory("").AddControl(invisibleSwitch);
        }
Пример #24
0
        private void RegisterStudioControls()
        {
            var slider_AngleAnkle = CreateSlider(displaySettings.Ankle_Angle, ctrl => ctrl.AnkleAngle, (ctrl, f) => ctrl.AnkleAngle = f, 0f, 60f);
            var slider_AngleLeg   = CreateSlider(displaySettings.Leg_Angle, ctrl => ctrl.LegAngle, (ctrl, f) => ctrl.LegAngle = f, 0f, 60f);
            var slider_Height     = CreateSlider(displaySettings.Height, ctrl => ctrl.Height, (ctrl, f) => ctrl.Height = f, 0f, 0.5f);

            StudioAPI.GetOrCreateCurrentStateCategory(displaySettings.Stiletto).AddControls(slider_AngleAnkle, slider_AngleLeg, slider_Height);

            CurrentStateCategorySlider CreateSlider(string name, Func <HeelInfo, float> get, Action <HeelInfo, float> set, float minValue, float maxValue)
            {
                var slider = new CurrentStateCategorySlider(name, (chara) => get(chara.charInfo.GetComponent <HeelInfo>()), minValue, maxValue);

                slider.Value.Subscribe(x =>
                {
                    foreach (var heelInfo in StudioAPI.GetSelectedCharacters().Select(y => y.charInfo.gameObject.GetComponent <HeelInfo>()))
                    {
                        set(heelInfo, x);
                    }
                });

                return(slider);
            }
        }
Пример #25
0
        private static Human GetCurrentVisibleGirl()
        {
            if (MakerAPI.InsideMaker)
            {
                return(MakerAPI.GetCharacterControl());
            }

            var m = GameObject.Find("CharaPosition/MainFemale");
            var f = m?.GetComponentInChildren <Female>();

            if (f != null)
            {
                return(f);
            }

            if (StudioAPI.InsideStudio)
            {
                var c = StudioAPI.GetSelectedControllers <BoneController>().FirstOrDefault();
                return(c?.ChaControl);
            }

            return((Human)FindObjectOfType <Female>() ?? FindObjectOfType <Male>());
        }
Пример #26
0
        private static void RegisterStudioControls()
        {
            var cat = StudioAPI.GetOrCreateCurrentStateCategory(null);

            cat.AddControl(new CurrentStateCategorySlider("Pregnancy", c =>
            {
                if (c.charInfo == null)
                {
                    return(0);
                }
                var controller = c.charInfo.GetComponent <PregnancyCharaController>();
                if (controller == null)
                {
                    return(0);
                }
                return(controller.Data.Week);
            }, 0, 40))
            .Value.Subscribe(f => { foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyCharaController>())
                                    {
                                        ctrl.Data.Week = Mathf.RoundToInt(f);
                                    }
                             });
        }
        public static void RegisterStudioControllerBasic()
        {
            if (!StudioAPI.InsideStudio)
            {
                return;
            }

            var bpEnable = new CurrentStateCategorySwitch("Enable BP Controller", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().enabled);

            bpEnable.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    if (value == false)
                    {
                        controller.ClearDanAgent();
                        controller.enabled = false;
                    }
                    else
                    {
                        controller.enabled = true;
                        controller.InitializeDanAgent();
                        controller.AddDanConstraints(nodeConstraintPlugin);
                    }
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bpEnable);

            var colliderRadiusScale = new CurrentStateCategorySlider("Collilder Radius Scale", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanColliderRadiusScale, 0.5f, 1.5f);

            colliderRadiusScale.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.DanColliderRadiusScale = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(colliderRadiusScale);

            var colliderLengthScale = new CurrentStateCategorySlider("Collilder Length Scale", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanColliderLengthScale, 0.5f, 1.5f);

            colliderLengthScale.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.DanColliderLengthScale = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(colliderLengthScale);

            var lengthSlider = new CurrentStateCategorySlider("Length Squish", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanLengthSquish, 0f, 1f);

            lengthSlider.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.DanLengthSquish = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(lengthSlider);

            var girthSlider = new CurrentStateCategorySlider("Girth Squish", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanGirthSquish, 0f, 2f);

            girthSlider.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.DanGirthSquish = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(girthSlider);

            var thresholdSlider = new CurrentStateCategorySlider("Squish Threshold", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanSquishThreshold, 0f, 1f);

            thresholdSlider.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.DanSquishThreshold = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(thresholdSlider);

            var autoTargeter = new CurrentStateCategoryDropdown("Auto-Target", new string[] { "Off", "Vaginal", "Anal", "Oral" }, c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().DanAutoTarget);

            autoTargeter.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.DanAutoTarget = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(autoTargeter);

            var maxPush = new CurrentStateCategorySlider("Max Push", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().MaxPush, 0f, 0.3f);

            maxPush.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.MaxPush = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(maxPush);

            var maxPull = new CurrentStateCategorySlider("Max Pull", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().MaxPull, 0f, 0.3f);

            maxPull.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.MaxPull = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(maxPull);

            var pullRate = new CurrentStateCategorySlider("Pull Rate", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().PullRate, 0f, 50f);

            pullRate.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.PullRate = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(pullRate);

            var returnRate = new CurrentStateCategorySlider("Return Rate", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().ReturnRate, 0f, 1f);

            returnRate.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.ReturnRate = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(returnRate);

            var bellyBulgeEnable = new CurrentStateCategorySwitch("Enable Belly Bulge", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().EnableBellyBulge);

            bellyBulgeEnable.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.EnableBellyBulge = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bellyBulgeEnable);

            var bellyBulgeScale = new CurrentStateCategorySlider("Belly Bulge Scale", c => StudioAPI.GetSelectedControllers <BetterPenetrationController>().First().BellyBulgeScale, 0.0f, 3.0f);

            bellyBulgeScale.Value.Subscribe(value =>
            {
                foreach (var controller in StudioAPI.GetSelectedControllers <BetterPenetrationController>())
                {
                    controller.BellyBulgeScale = value;
                }
            });
            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bellyBulgeScale);
        }
Пример #28
0
        private static void RegisterStudioControls()
        {
            if (!StudioAPI.InsideStudio)
            {
                return;
            }

            var breast = new CurrentStateCategorySwitch("Breast", ocichar => ocichar.charInfo.GetComponent <ColliderController>().BreastCollidersEnabled);

            breast.Value.Subscribe(value =>
            {
                var controller = GetSelectedController();
                if (controller == null)
                {
                    return;
                }
                if (controller.BreastCollidersEnabled != value)
                {
                    controller.BreastCollidersEnabled = value;
                    controller.ApplyBreastColliders();
                }
            });

#if KK
            var skirt = new CurrentStateCategorySwitch("Skirt", ocichar => ocichar.charInfo.GetComponent <ColliderController>().SkirtCollidersEnabled);
            skirt.Value.Subscribe(value =>
            {
                var controller = GetSelectedController();
                if (controller == null)
                {
                    return;
                }
                if (controller.SkirtCollidersEnabled != value)
                {
                    controller.SkirtCollidersEnabled = value;
                    controller.ApplySkirtColliders();
                }
            });
#endif

            var floor = new CurrentStateCategorySwitch("Floor", ocichar => ocichar.charInfo.GetComponent <ColliderController>().FloorColliderEnabled);
            floor.Value.Subscribe(value =>
            {
                var controller = GetSelectedController();
                if (controller == null)
                {
                    return;
                }
                if (controller.FloorColliderEnabled != value)
                {
                    controller.FloorColliderEnabled = value;
                    controller.ApplyFloorCollider();
                }
            });

            StudioAPI.GetOrCreateCurrentStateCategory("Colliders").AddControl(breast);
#if KK
            StudioAPI.GetOrCreateCurrentStateCategory("Colliders").AddControl(skirt);
#endif
            StudioAPI.GetOrCreateCurrentStateCategory("Colliders").AddControl(floor);
        }
Пример #29
0
        private static void RegisterStudioControls()
        {
            if (!StudioAPI.InsideStudio)
            {
                return;
            }

            List <string> bodyList        = new List <string>();
            List <string> bodyListDisplay = new List <string>();

            foreach (var x in BodyDictionary)
            {
                bodyList.Add(x.Value.BodyGUID);
                bodyListDisplay.Add(x.Value.DisplayName);
            }

            var bodyDropdown = new CurrentStateCategoryDropdown("Uncensor", bodyListDisplay.ToArray(), c => BodyIndex());

            bodyDropdown.Value.Subscribe(value =>
            {
                var controller = GetSelectedStudioController();

                if (controller != null)
                {
#if AI
                    if (controller.ChaControl.sex == 0)
                    {
                        bodyDropdown.Visible.OnNext(false);
                        return;
                    }
                    else
                    {
                        bodyDropdown.Visible.OnNext(true);
                    }
#endif
                    var guid = bodyList[value];
                    if (controller.BodyData?.BodyGUID != guid)
                    {
                        controller.BodyGUID = guid;
                        controller.UpdateUncensor();
                    }
                }
            });

            int BodyIndex()
            {
                var controller = GetSelectedStudioController();

                return(bodyList.IndexOf(controller.BodyData?.BodyGUID));
            }

            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(bodyDropdown);

            List <string> penisList        = new List <string>();
            List <string> penisListDisplay = new List <string>();

            foreach (var x in PenisDictionary)
            {
                penisList.Add(x.Value.PenisGUID);
                penisListDisplay.Add(x.Value.DisplayName);
            }

            var penisDropdown = new CurrentStateCategoryDropdown("Penis", penisListDisplay.ToArray(), c => PenisIndex());
            penisDropdown.Value.Subscribe(value =>
            {
                var controller = GetSelectedStudioController();

                if (controller != null)
                {
                    var guid = penisList[value];
                    if (controller.PenisData?.PenisGUID != guid)
                    {
                        controller.PenisGUID = guid;
                        controller.UpdateUncensor();
                    }
                }
            });

            int PenisIndex()
            {
                var controller = GetSelectedStudioController();

                if (controller.PenisData?.PenisGUID == null)
                {
                    return(penisList.IndexOf(DefaultPenisGUID));
                }
                return(penisList.IndexOf(controller.PenisData.PenisGUID));
            }

            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(penisDropdown);


            List <string> ballsList        = new List <string>();
            List <string> ballsListDisplay = new List <string>();

            ballsList.Add("None");
            ballsListDisplay.Add("None");

            foreach (var x in BallsDictionary)
            {
                ballsList.Add(x.Value.BallsGUID);
                ballsListDisplay.Add(x.Value.DisplayName);
            }

            var ballsDropdown = new CurrentStateCategoryDropdown("Balls", ballsListDisplay.ToArray(), c => BallsIndex());
            ballsDropdown.Value.Subscribe(value =>
            {
                var controller = GetSelectedStudioController();

                if (controller != null)
                {
                    if (value == 0)//"None"
                    {
                        if (controller.BallsGUID != null)
                        {
                            controller.BallsGUID    = null;
                            controller.DisplayBalls = false;
                            controller.UpdateUncensor();
                        }
                    }
                    else
                    {
                        var guid = ballsList[value];
                        if (controller.BallsData?.BallsGUID != guid)
                        {
                            controller.BallsGUID    = guid;
                            controller.DisplayBalls = true;
                            controller.UpdateUncensor();
                        }
                    }
                }
            });

            int BallsIndex()
            {
                var controller = GetSelectedStudioController();

                if (controller.DisplayBalls == false)
                {
                    return(ballsList.IndexOf("None"));
                }
                if (controller.BallsData?.BallsGUID == null)
                {
                    return(ballsList.IndexOf(DefaultBallsGUID));
                }
                return(ballsList.IndexOf(controller.BallsData?.BallsGUID));
            }

            StudioAPI.GetOrCreateCurrentStateCategory(StudioCategoryName).AddControl(ballsDropdown);
        }
Пример #30
0
        private static void RegisterStudioControls()
        {
            cat = StudioAPI.GetOrCreateCurrentStateCategory("Pregnancy +");

            cat.AddControl(new CurrentStateCategorySwitch("Reset P+ Shape", c =>
            {
                return(false);
            }))
            .Value.Subscribe(f => {
                if (f == false)
                {
                    return;
                }
                ResetAllSliders();
            });

            cat.AddControl(new CurrentStateCategorySwitch("Restore Last P+ Shape", c =>
            {
                return(false);
            }))
            .Value.Subscribe(f => {
                if (f == false)
                {
                    return;
                }
                if (PregnancyPlusPlugin.lastBellyState.HasAnyValue())
                {
                    RestoreSliders(PregnancyPlusPlugin.lastBellyState);
                }
            });

            cat.AddControl(new CurrentStateCategorySwitch(blendshapeText, c =>
            {
                return(false);
            }))
            .Value.Subscribe(f => {
                if (f == false)
                {
                    return;
                }
                //Open blendshape GUI on click
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    ctrl.OnOpenBlendShapeSelected();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationSize, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationSize : 0);
            },
                                                          SliderRange.inflationSize[0],
                                                          SliderRange.inflationSize[1]
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationSize == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationSize = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationMultiplier, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationMultiplier: 0);
            },
                                                          SliderRange.inflationMultiplier[0],
                                                          SliderRange.inflationMultiplier[1]
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationMultiplier == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationMultiplier = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationRoundness, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationRoundness: 0);
            },
                                                          SliderRange.inflationRoundness[0] * scaleLimits,
                                                          SliderRange.inflationRoundness[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationRoundness == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationRoundness = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationMoveY, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationMoveY: 0);
            },
                                                          SliderRange.inflationMoveY[0] * scaleLimits,
                                                          SliderRange.inflationMoveY[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationMoveY == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationMoveY = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationMoveZ, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationMoveZ: 0);
            },
                                                          SliderRange.inflationMoveZ[0] * scaleLimits,
                                                          SliderRange.inflationMoveZ[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationMoveZ == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationMoveZ = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationStretchX, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationStretchX: 0);
            },
                                                          SliderRange.inflationStretchX[0] * scaleLimits,
                                                          SliderRange.inflationStretchX[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationStretchX == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationStretchX = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationStretchY, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationStretchY: 0);
            },
                                                          SliderRange.inflationStretchY[0] * scaleLimits,
                                                          SliderRange.inflationStretchY[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationStretchY == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationStretchY = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationShiftY, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationShiftY: 0);
            },
                                                          SliderRange.inflationShiftY[0] * scaleLimits,
                                                          SliderRange.inflationShiftY[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationShiftY == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationShiftY = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationShiftZ, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationShiftZ: 0);
            },
                                                          SliderRange.inflationShiftZ[0] * scaleLimits,
                                                          SliderRange.inflationShiftZ[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationShiftZ == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationShiftZ = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationTaperY, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationTaperY: 0);
            },
                                                          SliderRange.inflationTaperY[0] * scaleLimits,
                                                          SliderRange.inflationTaperY[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationTaperY == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationTaperY = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationTaperZ, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationTaperZ: 0);
            },
                                                          SliderRange.inflationTaperZ[0] * scaleLimits,
                                                          SliderRange.inflationTaperZ[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationTaperZ == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationTaperZ = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationClothOffset, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationClothOffset: 0);
            },
                                                          SliderRange.inflationClothOffset[0] * scaleLimits,
                                                          SliderRange.inflationClothOffset[1] * scaleLimits
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationClothOffset == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationClothOffset = f;
                    ctrl.MeshInflate();
                }
            });

            cat.AddControl(new CurrentStateCategorySlider(inflationFatFold, c =>
            {
                var ctrl = GetCharCtrl(c);
                return(ctrl != null ? ctrl.infConfig.inflationFatFold: 0);
            },
                                                          SliderRange.inflationFatFold[0],
                                                          SliderRange.inflationFatFold[1]
                                                          ))
            .Value.Subscribe(f => {
                foreach (var ctrl in StudioAPI.GetSelectedControllers <PregnancyPlusCharaController>())
                {
                    if (ctrl.infConfig.inflationFatFold == f)
                    {
                        continue;
                    }
                    ctrl.infConfig.inflationFatFold = f;
                    ctrl.MeshInflate();
                }
            });
        }