コード例 #1
0
 protected void GlutesFixedUpdate(DAZCharacterSelector dcs, float fTopClothAdjustGlutes = 0.999f, bool hasAdjust = false)
 {
     // cycle all clothes for the Max Adjust Glutes Multi param
     foreach (DAZClothingItemControl dcc in containingAtom.GetComponentsInChildren <DAZClothingItemControl>())
     {
         if (dcc.GetBoolParamValue("enableGluteJointAdjust"))
         {
             hasAdjust = true;
             if (fTopClothAdjustGlutes < dcc.GetFloatParamValue("gluteJointSpringAndDamperMultiplier"))
             {
                 fTopClothAdjustGlutes = dcc.GetFloatParamValue("gluteJointSpringAndDamperMultiplier");
                 oTopGlutesDcc         = dcc;
             }
         }
     }
     // first update to reflect top adjust glutes to slider
     if (!oTopGlutesDccPrev)
     {
         jGlutesAdjust.val  = fTopClothAdjustGlutes;
         fRestoreTargets[4] = jGlutesAdjust.val;
         oTopGlutesDccPrev  = oTopGlutesDcc;
     }
     else
     {
         if (jGlutesAdjust.val != jGlutesAdjustPrev && hasAdjust)
         {
             // set adjust value to slider value
             jGlutesAdjustPrev = oTopGlutesDcc.GetFloatParamValue("gluteJointSpringAndDamperMultiplier");
             oTopGlutesDcc.SetFloatParamValue("gluteJointSpringAndDamperMultiplier", jGlutesAdjust.val);
             fTopClothAdjustGlutes = jGlutesAdjust.val;
         }
     }
     // find the correspondent simControl for gluteJointAdjust toggle
     // for undress to disable adjust glutes
     foreach (ClothSimControl csc in containingAtom.GetComponentsInChildren <ClothSimControl>())
     {
         if (oTopGlutesDcc && csc.name == oTopGlutesDcc.name)
         {
             oTopGlutesDcc.SetBoolParamValue("enableGluteJointAdjust", (csc.GetBoolParamValue("allowDetach") ? false : true));
             break;
         }
     }
     // update targets
     dcs.femaleGluteAdjustJoints.targetRotationX = -(fTopClothAdjustGlutes - 1) * jFloatGlutesRotationMultiX.val;
     dcs.femaleGluteAdjustJoints.targetRotationY = (fTopClothAdjustGlutes - 1) * jFloatGlutesRotationMultiY.val;
     dcs.femaleGluteAdjustJoints.targetRotationZ = -(fTopClothAdjustGlutes - 1) * jFloatGlutesRotationMultiZ.val;
     if (!bBreastGlute) // text on indicators
     {
         dGlutesTargetXButton.buttonText.text = "Glutes Rotation Target X: " + dcs.femaleGluteAdjustJoints.targetRotationX.ToString("0.00");
         dGlutesTargetYButton.buttonText.text = "Glutes Rotation Target Y: " + dcs.femaleGluteAdjustJoints.targetRotationY.ToString("0.00");
         dGlutesTargetZButton.buttonText.text = "Glutes Rotation Target Z: " + dcs.femaleGluteAdjustJoints.targetRotationZ.ToString("0.00");
         dGlutesAdjustButton.buttonText.text  = hasAdjust ? (oTopGlutesDcc.name + ": " + fTopClothAdjustGlutes.ToString("0.000")) : "No Cloth Adjust Glutes Enabled";
         jGlutesAdjust.val = hasAdjust ? fTopClothAdjustGlutes : jGlutesAdjust.val;
     }
 }
コード例 #2
0
ファイル: MorphMixer.cs プロジェクト: zskevin521/DeluxePlugin
        private void UpdateInitialMorphs()
        {
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            morphControl.GetMorphDisplayNames().ForEach((name) =>
            {
                initialMorphValues[name] = morphControl.GetMorphByDisplayName(name).morphValue;
            });
        }
コード例 #3
0
        public DressController(DollmasterPlugin dm) : base(dm)
        {
            JSONStorable geometryStorable = atom.GetStorableByID("geometry");

            geometry = geometryStorable as DAZCharacterSelector;

            priorClothes = geometry.clothingItems.ToList().Select((clothing) =>
            {
                return(clothing.active);
            }).ToList();
            dressed = true;
        }
コード例 #4
0
    public override void InitReferences()
    {
        base.InitReferences();

        _person    = containingAtom;
        _possessor = SuperController.singleton.centerCameraTarget.transform.GetComponent <Possessor>();
        _selector  = _person.GetComponentInChildren <DAZCharacterSelector>();

        _ovrCamera     = SuperController.singleton.OVRCenterCamera;
        _steamvrCamera = SuperController.singleton.ViveCenterCamera;
        _monitorCamera = SuperController.singleton.MonitorCenterCamera;
    }
コード例 #5
0
ファイル: MorphTools.cs プロジェクト: zskevin521/DeluxePlugin
 public override void Init()
 {
     try
     {
         JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
         DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
         GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;
     }
     catch (Exception e)
     {
         SuperController.LogError("Exception caught: " + e);
     }
 }
コード例 #6
0
        public void Init(SharedBehaviors plugin)
        {
            JSONStorable               geometry     = plugin.containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            blinkMorph = morphControl.GetMorphByDisplayName("Eyes Closed");

            blinkCurve = new AnimationCurve(blinkKeyframes);

            leftSquintMorph  = morphControl.GetMorphByDisplayName("Eyes Squint Left");
            rightSquintMorph = morphControl.GetMorphByDisplayName("Eyes Squint Right");
        }
コード例 #7
0
        public ExpressionController(DollmasterPlugin dm) : base(dm)
        {
            morphsEnabled = new JSONStorableBool("morphsEnabled", true, (bool enabled) =>
            {
                if (enabled == false)
                {
                    ZeroTargets();
                }
            });
            dm.RegisterBool(morphsEnabled);
            UIDynamicToggle morphsEnabledToggle = dm.CreateToggle(morphsEnabled);

            morphsEnabledToggle.label           = "Enable Facial Morphs";
            morphsEnabledToggle.backgroundColor = Color.green;

            voiceEnabled = new JSONStorableBool("voiceEnabled", true);
            dm.RegisterBool(voiceEnabled);
            UIDynamicToggle voiceEnabledToggle = dm.CreateToggle(voiceEnabled);

            voiceEnabledToggle.label           = "Enable Voice";
            voiceEnabledToggle.backgroundColor = Color.green;

            morphPercent = new JSONStorableFloat("morph percent", 0.7f, 0, 1, true);
            dm.RegisterFloat(morphPercent);
            UIDynamicSlider morphPercentSlider = dm.CreateSlider(morphPercent);

            JSONStorable         geometry  = atom.GetStorableByID("geometry");
            DAZCharacterSelector character = geometry as DAZCharacterSelector;

            morphControl = character.morphsControlUI;

            mouthOpenMorph   = morphControl.GetMorphByDisplayName("Mouth Open Wide");
            tongueRaiseMorph = morphControl.GetMorphByDisplayName("Tongue Raise-Lower");

            interpolationSpeed = new JSONStorableFloat("expression speed", 8f, 0.1f, 20.0f, true);
            dm.RegisterFloat(interpolationSpeed);
            dm.CreateSlider(interpolationSpeed);

            upperJaw = atom.GetStorableByID("upperJaw") as DAZBone;
            lowerJaw = atom.GetStorableByID("lowerJaw") as DAZBone;

            //  Hack to fix bad tongue morph values.
            //morphControl.GetMorphByDisplayName("Tongue In-Out").startValue = 1.0f;

            dm.CreateSpacer();

            // Prevent mouth from getting too big.
            dm.headAudioSource.SetFloatParamValue("volumeTriggerMultiplier", 0);
        }
コード例 #8
0
ファイル: Breathing.cs プロジェクト: lfe999/DeluxePlugin
        public override void Init()
        {
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            breathingMorph = morphControl.GetMorphByDisplayName("Breath1");
            throatMorph    = morphControl.GetMorphByDisplayName("deepthroat");

            chestControl = containingAtom.GetStorableByID("chestControl") as FreeControllerV3;
            headControl  = containingAtom.GetStorableByID("headControl") as FreeControllerV3;

            RegisterFloat(speed);
            CreateSlider(speed);
        }
コード例 #9
0
        public DAZCharacterSelector GetCharacter()
        {
            JSONStorable geometryStorable = containingAtom.GetStorableByID("geometry");

            if (geometryStorable != null)
            {
                DAZCharacterSelector geometry = geometryStorable as DAZCharacterSelector;
                if (geometry != null)
                {
                    return(geometry);
                }
            }

            return(null);
        }
コード例 #10
0
        private void ResetMorphs()
        {
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            morphControl.GetMorphDisplayNames().ForEach((name) =>
            {
                if (toggleRelations.ContainsKey(name))
                {
                    DAZMorph morph   = morphControl.GetMorphByDisplayName(name);
                    morph.morphValue = initialMorphValues[name];
                }
            });
        }
コード例 #11
0
        public void Init(Atom containingAtom)
        {
            head = containingAtom.GetStorableByID("head").transform;
            DAZCharacterSelector geometry = containingAtom.GetComponentInChildren <DAZCharacterSelector>();

            hairItems = geometry.hairItems.ToList()
                        .Where(it => {
                HashSet <string> bodyHairTags = new HashSet <string> {
                    "genital", "arms", "full body", "legs", "torso"
                };
                return(it.isLatestVersion && !bodyHairTags.Overlaps(it.tagsArray));
            }).ToList();

            activeHairSims = new Dictionary <string, ActiveHairSim>();
            StartCoroutine(RunCheck());
        }
コード例 #12
0
 // FixedUpdate is called with each physics simulation frame by Unity
 void FixedUpdate()
 {
     try
     {
         if (containingAtom.type != "Person")
         {
             return;
         }
         DAZCharacterSelector dcs = containingAtom.GetComponentInChildren <DAZCharacterSelector>();
         BreastsFixedUpdate(dcs);
         GlutesFixedUpdate(dcs);
     }
     catch (Exception e)
     {
         SuperController.LogError("Exception caught FixedUpdate(): " + e);
     }
 }
コード例 #13
0
ファイル: BodySwap.cs プロジェクト: zskevin521/DeluxePlugin
        private void ResetMorphs()
        {
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            morphControl.GetMorphDisplayNames().ForEach((name) =>
            {
                DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                if (initialMorphValues.ContainsKey(name) == false)
                {
                    Debug.Log("morph was not initially found: " + name + ", not resetting this morph");
                    return;
                }
                morph.morphValue = initialMorphValues[name];
            });
        }
コード例 #14
0
        /// <summary>
        /// Extension method to get the morph control ui on an atom
        ///
        /// Throws InvalidOperationException if the atom doesn't make sense
        /// </summary>
        /// <param name="atom"></param>
        /// <returns></returns>
        public static GenerateDAZMorphsControlUI GetMorphsControlUI(this Atom atom)
        {
            JSONStorable geometry = atom.GetStorableByID("geometry");

            if (geometry == null)
            {
                throw new InvalidOperationException($"Cannot get morphs control for this atom: {atom.uid}");
            }

            DAZCharacterSelector dcs = geometry as DAZCharacterSelector;

            if (dcs == null)
            {
                throw new InvalidOperationException($"Cannot get morphs control for this atom: {atom.uid}");
            }

            return(dcs.morphsControlUI);
        }
コード例 #15
0
ファイル: MorphAnimation.cs プロジェクト: lfe999/DeluxePlugin
        public override void Init()
        {
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            var pluginPath = GetPluginPath();
            var path       = pluginPath + "/animations";
            var files      = SuperController.singleton.GetFilesAtPath(path);

            foreach (var file in files)
            {
                var fileName = PathExtQualia.GetFileNameWithoutExtension(file);
                CreateButton("Test " + fileName).button.onClick.AddListener(() =>
                {
                    var json    = JSON.Parse(SuperController.singleton.ReadFileIntoString(file)).AsObject;
                    Playback pb = new Playback(json, morphControl);
                    pb.Play();
                });
            }

            List <string> twitches = new List <string>()
            {
                "cheekcrease",
                "cheekeyeflex",
                "cheekflexleft",
                "cheekflexright",
                "lipspart",
                "nosewrinkle",
                "nostrilflare",
                "smallsmile",
                "mediumsmile",
                "bigsmile",
            };

            foreach (var twitchFile in twitches)
            {
                var p    = pluginPath + "/animations/" + twitchFile + ".json";
                var json = JSON.Parse(SuperController.singleton.ReadFileIntoString(p)).AsObject;
                affectations.Add(new Playback(json, morphControl));
            }
        }
コード例 #16
0
        public override void Init()
        {
            eyesControl = containingAtom.GetStorableByID("Eyes") as EyesControl;

            faceCollider = containingAtom.GetComponentsInChildren <CapsuleCollider>().ToList().Find(collider => collider.name == "AutoColliderAutoCollidersFaceCentral1Hard");

            headBone = containingAtom.GetStorableByID("head") as DAZBone;

            leftEyeReference = new GameObject().transform;
            leftEyeReference.SetParent(headBone.transform, false);
            leftEyeReference.localPosition = new Vector3(-0.05f, 0.05f, 0.05f);

            rightEyeReference = new GameObject().transform;
            rightEyeReference.SetParent(headBone.transform, false);
            rightEyeReference.localPosition = new Vector3(0.05f, 0.05f, 0.05f);

            #region Debug
            //debugObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            //GameObject.Destroy(debugObject.GetComponent<Collider>());
            //debugObject.transform.SetParent(headBone.transform, false);
            //debugObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            //debugObject.transform.localPosition = new Vector3(-0.05f, 0.05f, 0.05f);

            //float radius = faceCentralCollider.radius;
            //float height = faceCentralCollider.height;
            //debugObject = GameObject.CreatePrimitive(PrimitiveType.Capsule);
            //debugObject.transform.SetParent(faceCentralCollider.transform, false);
            //debugObject.transform.parent = faceCentralCollider.gameObject.transform;
            //debugObject.transform.localScale = new Vector3(radius, height * 0.5f, radius);
            //GameObject.Destroy(debugObject.GetComponent<Collider>());
            #endregion

            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;
            leftSquintMorph    = morphControl.GetMorphByDisplayName("Eyes Squint Left");
            rightSquintMorph   = morphControl.GetMorphByDisplayName("Eyes Squint Right");
            pupilDilationMorph = morphControl.GetMorphByDisplayName("PupilDilation");

            RegisterFloat(squintSpeed);
            CreateSlider(squintSpeed);
        }
コード例 #17
0
        public Expressions(DollmasterPlugin dm) : base(dm)
        {
            EXPRESSIONS_PATH = DollmasterPlugin.ASSETS_PATH + "/Expressions";
            string MANIFEST_PATH = EXPRESSIONS_PATH + "/expression_manifest.json";

            Debug.Log(MANIFEST_PATH);
            manifest = JSON.Parse(SuperController.singleton.ReadFileIntoString(MANIFEST_PATH)).AsObject;

            mouthOpenGroup   = new ExpressionGroup(manifest["mouth open"].AsObject, dm);
            mouthClosedGroup = new ExpressionGroup(manifest["mouth closed"].AsObject, dm);
            eyesGroup        = new ExpressionGroup(manifest["eyes"].AsObject, dm);
            idleGroup        = new ExpressionGroup(manifest["idle"].AsObject, dm);
            kissGroup        = new ExpressionGroup(manifest["kiss"].AsObject, dm);
            climaxGroup      = new ExpressionGroup(manifest["climax"].AsObject, dm);

            JSONStorable         geometry  = atom.GetStorableByID("geometry");
            DAZCharacterSelector character = geometry as DAZCharacterSelector;

            morphControl = character.morphsControlUI;
        }
コード例 #18
0
    public override void Awake()
    {
        try
        {
            base.Awake();

            _person    = containingAtom;
            _possessor = SuperController.singleton.centerCameraTarget.transform.GetComponent <Possessor>();
            _selector  = _person.GetComponentInChildren <DAZCharacterSelector>();

            _ovrCamera     = SuperController.singleton.OVRCenterCamera;
            _steamvrCamera = SuperController.singleton.ViveCenterCamera;
            _monitorCamera = SuperController.singleton.MonitorCenterCamera;

            InitControls();
        }
        catch (Exception e)
        {
            SuperController.LogError("Failed to initialize HideGeometry: " + e);
        }
    }
コード例 #19
0
        private void saveLoadMorphs(bool saveM)
        {
            int                        C            = 0;
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

            morphControl.GetMorphDisplayNames().ForEach((name) =>
            {
                if (saveM == true)
                {
                    morphDict[name] = morphControl.GetMorphByDisplayName(name).morphValue;
                }
                else
                {
                    morphControl.GetMorphByDisplayName(name).morphValue = morphDict[name];
                }
                C++;
            });
            SuperController.LogMessage("Morph total : " + C.ToString());
        }
コード例 #20
0
ファイル: Facial.cs プロジェクト: zskevin521/DeluxePlugin
        public Facial(JSONStorable geometryStorable, JSONNode node)
        {
            foreach (KeyValuePair <string, JSONNode> kvp in node.AsObject)
            {
                string morphName = kvp.Key;
                morphGoals.Add(morphName, float.Parse(node[morphName]));
                morphGoalsTargets.Add(morphName, 0.0f);

                JSONStorable js = geometryStorable;
                if (js != null)
                {
                    DAZCharacterSelector       dcs     = js as DAZCharacterSelector;
                    GenerateDAZMorphsControlUI morphUI = dcs.morphsControlUI;
                    if (morphUI != null)
                    {
                        morphTargets.Add(morphName, morphUI.GetMorphByDisplayName(morphName));
                    }
                }
            }

            morphNames = morphTargets.Keys.ToList().ToArray();
        }
コード例 #21
0
        Dictionary <DAZSkinWrapSwitcher, List <string> > GetWrapProgression()
        {
            JSONStorable         geometryStorable = atom.GetStorableByID("geometry");
            DAZCharacterSelector geometry         = geometryStorable as DAZCharacterSelector;
            Dictionary <DAZSkinWrapSwitcher, List <string> > wrapToProgressList = new Dictionary <DAZSkinWrapSwitcher, List <string> >();

            atom.GetStorableIDs().ForEach((s) =>
            {
                JSONStorable store = atom.GetStorableByID(s);
                store.GetComponents <DAZSkinWrap>().ToList().ForEach((wrap) =>
                {
                    DAZSkinWrapSwitcher switcher = store.GetComponent <DAZSkinWrapSwitcher>();
                    if (switcher == null)
                    {
                        return;
                    }

                    if (wrap.enabled == false)
                    {
                        return;
                    }

                    if (s.Contains("Style") == false)
                    {
                        return;
                    }

                    if (wrapToProgressList.ContainsKey(switcher) == false)
                    {
                        wrapToProgressList[switcher] = new List <string>();
                    }

                    wrapToProgressList[switcher].Add(wrap.wrapName);
                });
            });

            return(wrapToProgressList);
        }
コード例 #22
0
ファイル: Breathe.cs プロジェクト: zskevin521/DeluxePlugin
        public override void Init()
        {
            try
            {
                JSONStorable js = containingAtom.GetStorableByID("geometry");
                if (js != null)
                {
                    DAZCharacterSelector       dcs     = js as DAZCharacterSelector;
                    GenerateDAZMorphsControlUI morphUI = dcs.morphsControlUI;
                    if (morphUI != null)
                    {
                        breatheMorph = morphUI.GetMorphByDisplayName("Breath1");
                    }
                }

                chest = containingAtom.GetStorableByID("chestControl") as FreeControllerV3;
                if (chest != null)
                {
                    chest.jointRotationDriveSpring = 60.0f;
                    chest.jointRotationDriveDamper = 0.5f;
                }

                head = containingAtom.GetStorableByID("headControl") as FreeControllerV3;
                if (head != null)
                {
                    head.RBHoldPositionSpring = 4000.0f;
                }

                intensity           = new JSONStorableFloat("intensity", 0, 0, 1, true, true);
                intensity.storeType = JSONStorableParam.StoreType.Full;
                CreateSlider(intensity);
                RegisterFloat(intensity);
            }
            catch (Exception e)
            {
                SuperController.LogError("Exception caught: " + e);
            }
        }
コード例 #23
0
        protected void UpdateRandomParams()
        {
            JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
            DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
            GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;


            Dictionary <string, UIDynamicToggle> togglesOn = toggles.Where(t => t.Value.toggle.isOn).ToDictionary(p => p.Key, p => p.Value);

            // define the random values to switch to
            foreach (KeyValuePair <string, UIDynamicToggle> entry in togglesOn)
            {
                string name = entry.Key;
                if (name != "Play")
                {
                    DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                    if (morph.animatable == false)
                    {
                        float valeur = UnityEngine.Random.Range(minSlider.val, maxSlider.val) * multiSlider.val;
                        newMorphValues[name] = valeur;
                    }
                }
            }
        }
コード例 #24
0
        protected void FixedUpdate()
        {
            if (toggles["Play"].toggle.isOn)
            {
                JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
                DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
                GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

                // morph progressively every morphs to their new values
                morphControl.GetMorphDisplayNames().ForEach((name) =>
                {
                    DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                    if (toggles.ContainsKey(name) && toggles[name].toggle.isOn)
                    {
                        if (morph.animatable == false)
                        {
                            float valeur     = Mathf.Lerp(CurrentMorphsValues[name], newMorphValues[name], Time.deltaTime * animLengthSlider.val);
                            morph.morphValue = valeur;
                        }
                    }
                });
                UpdateCurrentMorphs();
            }
        }
コード例 #25
0
        public MorphSearch(BaseModule baseModule)
        {
            UI        ui       = baseModule.ui;
            Transform moduleUI = baseModule.moduleUI;
            Atom      atom     = baseModule.atom;

            searchBox = ui.CreateTextInput("Search For Morph", 800, 100, moduleUI);
            searchBox.transform.localPosition = new Vector3(0, -110, 0);

            paginationSlider = ui.CreateSlider("Page", 930, 80, true, moduleUI);
            paginationSlider.transform.localPosition = new Vector3(0, -200, 0);

            paginationValue = new JSONStorableFloat("Page", 0, (float value) =>
            {
            }, 0, 10, true, true);
            paginationSlider.valueFormat = "n0";
            paginationValue.slider       = paginationSlider.slider;

            paginationSlider.gameObject.SetActive(false);

            GridLayoutGroup layout = ui.CreateGridLayout(1200, 800, moduleUI);

            layout.transform.localPosition = new Vector3(0, -1010, 0);
            layout.constraintCount         = 3;
            layout.constraint = GridLayoutGroup.Constraint.FixedColumnCount;
            layout.GetComponent <RectTransform>().pivot = new Vector2(0, 0);

            layout.cellSize = new Vector2(400, 80);

            for (int i = 0; i < MAX_MORPHS_PER_PAGE - 1; i++)
            {
                UIDynamicSlider slider = ui.CreateMorphSlider("Slider " + i, 400, 80, moduleUI);
                slider.transform.SetParent(layout.transform, false);

                morphSliders.Add(slider);
                slider.gameObject.SetActive(false);
            }


            DAZCharacterSelector personGeometry = atom.GetStorableByID("geometry") as DAZCharacterSelector;

            morphControl = personGeometry.morphsControlUI;

            regions = new HashSet <string>();
            morphControl.GetMorphDisplayNames().ForEach((name) =>
            {
                DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                regions.Add(morph.region);
            });

            morphNames = morphControl.GetMorphDisplayNames();

            searchBox.onValueChanged.AddListener(UpdateSearch);

            UIDynamicButton clearButton = ui.CreateButton("Clear", 120, 100, moduleUI);

            clearButton.transform.localPosition = new Vector3(810, -110, 0);
            clearButton.button.onClick.AddListener(() =>
            {
                searchBox.text = "";
                ClearSearch();
            });

            VerticalLayoutGroup commonTermsGroup = ui.CreateVerticalLayout(220, 0, moduleUI);

            commonTermsGroup.transform.localPosition = new Vector3(-230, -200, 0);
            commonTermsGroup.GetComponent <RectTransform>().pivot = new Vector2(0, 0);

            commonTermsGroup.childAlignment = TextAnchor.UpperLeft;


            for (int i = 0; i < MAX_TERMS; i++)
            {
                UIDynamicButton termButton = ui.CreateButton("Term", 220, 40, moduleUI);
                termButton.transform.SetParent(commonTermsGroup.transform, false);
                termButtons.Add(termButton);
                UI.ColorButton(termButton, Color.white, new Color(0.3f, 0.4f, 0.6f));

                termButton.gameObject.SetActive(false);

                ContentSizeFitter csf = termButton.gameObject.AddComponent <ContentSizeFitter>();
                csf.verticalFit = ContentSizeFitter.FitMode.MinSize;
            }

            //Debug.Log("----------------------------");
            //UIDynamicSlider testSlider = ui.CreateMorphSlider("test");
            //ui.DebugDeeper(testSlider.transform);
        }
コード例 #26
0
        public void ApplyToPerson(Atom aPerson, bool aColor = true, bool aStyle = true, bool aPhysics = true)
        {
            DAZCharacterSelector character = aPerson.GetStorableByID("geometry") as DAZCharacterSelector;
            List <string>        hairSettingsRestoreList = new List <string>();
            List <string>        restoreStorablesList    = new List <string>();

            HairStyle origStyle = null;

            // Colors are stored per-style. If we change styles, but not color, the color will change.
            // So, if we are changing style but not color, we need to store off the current color and
            // restore it after the style change to ensure the color doesn't actually change.
            if (aStyle && !aColor)
            {
                origStyle = HairStyle.CreateFromPerson(aPerson);
            }

            JSONStorable scalps = FindStorableByName(aPerson, "Scalps");
            JSONStorable styles = FindStorableByName(aPerson, "Styles");

            // Apply any style changes so we are sure to apply modifications to the correct style
            if (aStyle)
            {
                RestoreStorable(scalps, _savedJson["Scalps"]);
                RestoreStorable(styles, _savedJson["Styles"]);
            }

            // Now that any style change is done, let's get the rest of the storables
            JSONStorable moveContainer = FindStorableByName(aPerson, "ScalpContainer");
            JSONStorable hairSettings  = FindStorableByName(aPerson, "HairSettings");

            // Get Style and Scalp choices
            string       scalpName     = scalps.GetStringChooserParamValue("choiceName");
            JSONStorable scalpStorable = null;

            if (scalpName != "NoScalp")
            {
                scalpStorable = FindStorableByName(aPerson, scalpName.Replace("Scalp", "HairScalp"));
            }

            // HairSettings contains color, style and physics, so has a special-case filter list
            if (aColor)
            {
                restoreStorablesList.AddRange(colorLoadList);
                hairSettingsRestoreList.AddRange(simColorList);
            }
            if (aStyle)
            {
                restoreStorablesList.AddRange(styleLoadList);
                hairSettingsRestoreList.AddRange(simStyleList);
                // Scalp style has already been restored, if applicable.
            }
            if (aPhysics)
            {
                restoreStorablesList.AddRange(physicsLoadList);
                hairSettingsRestoreList.AddRange(simPhysicsList);
            }

            foreach (var saveGroup in _savedJson)
            {
                List <string> restoreList = null;
                string        groupName   = saveGroup.Key;
                if (!restoreStorablesList.Contains(groupName))
                {
                    continue;
                }

                // Hair Settings contains all parameters for sim hair so must be filtered
                if (groupName == "HairSettings")
                {
                    restoreList = hairSettingsRestoreList;
                }

                // Scalp params are stored per-style, but saved as scalpParams. Adjust the name to the current style.
                if (groupName == "scalpParams")
                {
                    if (null != scalpStorable)
                    {
                        groupName = scalpStorable.name;
                    }
                    else
                    {
                        continue; // Can't save scalp parameters when there is no scalp
                    }
                }

                // Restore the setting!
                var storable = FindStorableByName(aPerson, groupName);
                RestoreStorable(storable, saveGroup.Value, restoreList);
            }

            // If we switched styles without loading color, then copy over the color from the last style
            origStyle?.ApplyToPerson(aPerson, true, false, false);
        }
コード例 #27
0
        public override void Init()
        {
            try
            {
                if (containingAtom.type != "Person")
                {
                    SuperController.LogError("Use this plugin on a Person only");
                    return;
                }

                // Save the original hair style
                _original = HairStyle.CreateFromPerson(containingAtom);
                if (null == _original)
                {
                    SuperController.LogError("This plugin only works on SimV2 Hair");
                    return;
                }

                // Create preset directory
                _lastBrowseDir = CreateDirectory(GetPluginPath() + @"hair_presets\");

                pluginLabelJSON.val = pluginName + " " + pluginVersion;

                // Add Load/Save buttons
                var btn = CreateButton("Load Preset");
                btn.button.onClick.AddListener(() =>
                {
                    _undoLoadPreset = HairStyle.CreateFromPerson(containingAtom);
                    SuperController.singleton.NormalizeMediaPath(_lastBrowseDir); // This sets the path iff it exists
                    SuperController.singleton.GetMediaPathDialog(HandleLoadPreset, saveExt);
                });

                btn = CreateButton("Load Pre-Load Preset");
                btn.button.onClick.AddListener(() =>
                {
                    _undoLoadPreset?.ApplyToPerson(containingAtom, _loadColor.val, _loadStyle.val, _loadPhysics.val);
                });

                _loadStyle = new JSONStorableBool("loadStyle", true);
                var toggle = CreateToggle(_loadStyle);
                toggle.label = "Load Style";

                _loadColor   = new JSONStorableBool("loadColor", true);
                toggle       = CreateToggle(_loadColor);
                toggle.label = "Load Color";

                _loadPhysics = new JSONStorableBool("loadPhysics", true);
                toggle       = CreateToggle(_loadPhysics);
                toggle.label = "Load Physics";


                var spacer = CreateSpacer();
                spacer.height = 100;

                var label = CreateTextField(new JSONStorableString("", ""));
                label.text = pluginName + " " + pluginVersion + "\n"
                             + "\n"
                             + "Load Original loads hair when plugin was loaded.\n"
                             + "\n"
                             + "'Quick Load/Save' can be used as a temporary save slot.\n"
                             + "\n"
                             + "All 'Load' buttons respect selection checkboxes."
                ;
                label.height  = 350;
                spacer        = CreateSpacer();
                spacer.height = 100;

                btn = CreateButton("Load Original");
                btn.button.onClick.AddListener(() =>
                {
                    _original?.ApplyToPerson(containingAtom, _loadColor.val, _loadStyle.val, _loadPhysics.val);
                });

                btn = CreateButton("Quick Save");
                btn.button.onClick.AddListener(() =>
                {
                    _quickSaved = HairStyle.CreateFromPerson(containingAtom);
                });

                btn = CreateButton("Quick Load");
                btn.button.onClick.AddListener(() =>
                {
                    _quickSaved?.ApplyToPerson(containingAtom, _loadColor.val, _loadStyle.val, _loadPhysics.val);
                });

                btn = CreateButton("Save Preset", true);
                btn.button.onClick.AddListener(() =>
                {
                    SuperController.singleton.NormalizeMediaPath(_lastBrowseDir); // This sets the path iff it exists
                    SuperController.singleton.GetMediaPathDialog(HandleSavePreset, saveExt);

                    // Update the browser to be a Save browser
                    uFileBrowser.FileBrowser browser = SuperController.singleton.mediaFileBrowserUI;
                    browser.SetTextEntry(true);
                    browser.fileEntryField.text = String.Format("{0}.{1}", ((int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString(), saveExt);
                    browser.ActivateFileNameField();
                });
                spacer        = CreateSpacer(true);
                spacer.height = 300;

                btn = CreateButton("Open Hair Settings", true);
                btn.button.onClick.AddListener(() =>
                {
                    DAZCharacterSelector character = containingAtom?.GetStorableByID("geometry") as DAZCharacterSelector;
                    var ui = character.selectedHairGroup?.customizationUI;
                    if (null != ui)
                    {
                        _undoHairSettings = HairStyle.CreateFromPerson(containingAtom);
                        SuperController.singleton.SetCustomUI(ui);
                    }
                });
                btn = CreateButton("Load Pre-Open Hair Settings", true);
                btn.button.onClick.AddListener(() =>
                {
                    _undoHairSettings?.ApplyToPerson(containingAtom);
                });
            }
            catch (Exception e)
            {
                SuperController.LogError("Exception caught: " + e);
            }
        }
コード例 #28
0
ファイル: MorphMixer.cs プロジェクト: zskevin521/DeluxePlugin
        public override void Init()
        {
            try {
                UpdateInitialMorphs();


                #region Choose Atom
                Atom          otherAtom       = null;
                List <string> receiverChoices = SuperController.singleton.GetAtoms()
                                                .Where(atom => atom.GetStorableByID("geometry") != null && atom != containingAtom)
                                                .Select(atom => atom.name).ToList();
                JSONStorableStringChooser receiverChoiceJSON = new JSONStorableStringChooser("copyFrom", receiverChoices, null, "Copy From", delegate(string otherName)
                {
                    otherAtom = GetAtomById(otherName);
                });
                receiverChoiceJSON.storeType = JSONStorableParam.StoreType.Full;
                UIDynamicPopup dp = CreateScrollablePopup(receiverChoiceJSON, false);
                dp.popupPanelHeight = 250f;
                RegisterStringChooser(receiverChoiceJSON);
                #endregion


                #region Morph Slider
                JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
                DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
                GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

                JSONStorableFloat morphMixAmount = new JSONStorableFloat("morphMix", 0.0f, 0f, 1f, true);
                UIDynamicSlider   morphSlider    = CreateSlider(morphMixAmount, true);

                morphSlider.slider.onValueChanged.AddListener(delegate(float mixValue)
                {
                    if (otherAtom == null)
                    {
                        Debug.Log("other atom is null");
                        return;
                    }

                    JSONStorable otherGeometry                   = otherAtom.GetStorableByID("geometry");
                    DAZCharacterSelector otherCharacter          = otherGeometry as DAZCharacterSelector;
                    GenerateDAZMorphsControlUI otherMorphControl = otherCharacter.morphsControlUI;

                    morphControl.GetMorphDisplayNames().ForEach((name) =>
                    {
                        DAZMorph otherMorph = otherMorphControl.GetMorphByDisplayName(name);
                        DAZMorph morph      = morphControl.GetMorphByDisplayName(name);
                        float initialValue  = initialMorphValues[name];
                        float targetValue   = otherMorph.morphValue;
                        morph.morphValue    = initialValue + ((targetValue - initialValue) * mixValue);
                    });
                });
                #endregion


                #region Apply Button
                UIDynamicButton applyButton = CreateButton("Apply As Starting Value", true);
                applyButton.button.onClick.AddListener(delegate()
                {
                    UpdateInitialMorphs();
                });
                #endregion

                CreateSpacer();
                CreateTextField(new JSONStorableString("instructions", "\nPick a Person atom and use the slider to blend morphs."));
                CreateTextField(new JSONStorableString("instructions", "\nUse the Apply As Starting Value button to freeze morphs into place if you want to load a new target appearance."));
            }
            catch (Exception e) {
                SuperController.LogError("Exception caught: " + e);
            }
        }
コード例 #29
0
        public Blend(DollMaker dm) : base(dm)
        {
            dm.mainControls.RegisterTab("Blend", moduleUI, this);

            Button addMorphPresetButton = CreateModuleButton("Add Preset").button;

            addMorphPresetButton.onClick.AddListener(() =>
            {
                SuperController.singleton.editModeToggle.isOn = true;
                SuperController.singleton.ShowMainHUD();
            });
            JSONStorableUrl url = new JSONStorableUrl("presetPath", "", (string path) =>
            {
                if (string.IsNullOrEmpty(path))
                {
                    return;
                }

                string jsonString    = SuperController.singleton.ReadFileIntoString(path);
                JSONClass appearance = JSON.Parse(jsonString).AsObject;

                AddAppearance(appearance, PathExt.GetFileNameWithoutExtension(path));
            });

            url.RegisterFileBrowseButton(addMorphPresetButton);

            Button addEntirePresetFolder = CreateModuleButton("Add Folder").button;

            addEntirePresetFolder.onClick.AddListener(() =>
            {
                SuperController.singleton.editModeToggle.isOn = true;
                SuperController.singleton.ShowMainHUD();

                PresetManager pm             = atom.GetComponentInChildren <PresetManager>(includeInactive: true);
                PresetManagerControlUI pmcui = atom.GetComponentInChildren <PresetManagerControlUI>(includeInactive: true);
                if (pm != null && pmcui != null)
                {
                    pm.itemType         = PresetManager.ItemType.Custom;
                    pm.customPath       = "Atom/Person/Morphs/";
                    string path         = pm.GetStoreFolderPath();
                    List <string> files = SuperController.singleton.GetFilesAtPath(path).ToList().Where((fileName) =>
                    {
                        return(PathExt.GetExtension(fileName) == ".vap");
                    }).ToList();

                    files.ForEach((file) =>
                    {
                        string jsonString    = SuperController.singleton.ReadFileIntoString(file);
                        JSONClass appearance = JSON.Parse(jsonString).AsObject;
                        AddAppearance(appearance, PathExt.GetFileNameWithoutExtension(file));
                    });
                }
            });

            // Deprecated.
            //Button addAppearanceButton = CreateModuleButton("Add From Look").button;
            //addAppearanceButton.onClick.AddListener(() =>
            //{
            //    SuperController.singleton.editModeToggle.isOn = true;
            //    SuperController.singleton.ShowMainHUD();

            //    SuperController.singleton.GetDirectoryPathDialog((string dir) =>
            //    {
            //        if (dir == null || !(dir != string.Empty))
            //        {
            //            return;
            //        }

            //        //  have load dialog work both inside and outside folder
            //        try
            //        {
            //            PerformLoadOnPath(dir);
            //        }
            //        catch
            //        {
            //            string folderName = "\\" + dir.Substring(dir.LastIndexOf('\\') + 1) + "\\";
            //            dir = dir.Replace(folderName, "\\");
            //            PerformLoadOnPath(dir);
            //        }

            //    }, SuperController.singleton.savesDir + "Person" + "\\appearance");
            //});


            appearancesLayout = ui.CreateGridLayout(1000, 500, moduleUI.transform);
            appearancesLayout.transform.localPosition = new Vector3(0, -600, 0);
            appearancesLayout.GetComponent <RectTransform>().pivot = new Vector2(0, 0);
            appearancesLayout.childAlignment  = TextAnchor.UpperLeft;
            appearancesLayout.constraint      = GridLayoutGroup.Constraint.FixedColumnCount;
            appearancesLayout.constraintCount = 3;
            appearancesLayout.cellSize        = new Vector2(Mathf.FloorToInt(1000 / 3), 80);

            SuperController.singleton.currentSaveDir = SuperController.singleton.currentLoadDir;
            JSONClass initialAppearance = SuperController.singleton.GetSaveJSON(atom, false, true).AsObject["atoms"].AsArray[0].AsObject;

            AddAppearance(initialAppearance, "Current", 1);

            CreateModuleButton("Clear List").button.onClick.AddListener(() =>
            {
                ClearAppearances();
                initialAppearance = SuperController.singleton.GetSaveJSON(atom, false, true).AsObject["atoms"].AsArray[0].AsObject;
                AddAppearance(initialAppearance, "Current", 1);
            });

            CreateModuleButton("Randomize").button.onClick.AddListener(() =>
            {
                sliders.ForEach((slider) =>
                {
                    slider.slider.value = UnityEngine.Random.Range(0.0f, 1.0f);
                });
            });

            CreateModuleButton("Average").button.onClick.AddListener(() =>
            {
                sliders.ForEach((slider) =>
                {
                    slider.slider.value = 0.5f;
                });
            });


            JSONStorable         geometry  = atom.GetStorableByID("geometry");
            DAZCharacterSelector character = geometry as DAZCharacterSelector;

            morphControl = character.morphsControlUI;
        }
コード例 #30
0
        public override void Init()
        {
            try {
                UpdateInitialMorphs();
                UpdateNewMorphs();
                UpdateCurrentMorphs();

                Dictionary <string, UIDynamicToggle> toggles         = new Dictionary <string, UIDynamicToggle>();
                Dictionary <string, UIDynamicButton> buttons         = new Dictionary <string, UIDynamicButton>();
                Dictionary <string, string>          toggleRelations = new Dictionary <string, string>();

                #region Sliders
                minSlider           = new JSONStorableFloat("Minimum value", -0.3f, -1f, 1.0f, true);
                minSlider.storeType = JSONStorableParam.StoreType.Full;
                RegisterFloat(minSlider);
                CreateSlider(minSlider, false);

                maxSlider           = new JSONStorableFloat("Maximum value", 0.3f, -1f, 1.0f, true);
                maxSlider.storeType = JSONStorableParam.StoreType.Full;
                RegisterFloat(maxSlider);
                CreateSlider(maxSlider, false);

                multiSlider           = new JSONStorableFloat("Multiplier", 1f, 0f, 2f, true);
                multiSlider.storeType = JSONStorableParam.StoreType.Full;
                RegisterFloat(multiSlider);
                CreateSlider(multiSlider, false);
                #endregion

                #region Region Buttons Preparation
                JSONStorable               geometry     = containingAtom.GetStorableByID("geometry");
                DAZCharacterSelector       character    = geometry as DAZCharacterSelector;
                GenerateDAZMorphsControlUI morphControl = character.morphsControlUI;

                HashSet <string>            regions          = new HashSet <string>();
                HashSet <string>            LastRegions      = new HashSet <string>();
                Dictionary <string, string> temporaryToggles = new Dictionary <string, string>();

                JSONStorableBool playingBool = new JSONStorableBool("Play", false);
                playingBool.storeType = JSONStorableParam.StoreType.Full;
                RegisterBool(playingBool);
                toggles["Play"] = CreateToggle((playingBool), false);

                morphControl.GetMorphDisplayNames().ForEach((name) =>
                {
                    DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                    regions.Add(morph.region);

                    if (
                        poseRegion.Any((str) => morph.region.Contains(str)) &&
                        !bodyRegion.Any((str) => morph.region.Contains(str)) &&
                        !morph.region.Contains("Reloaded")
                        )
                    {
                        string[] posePaths      = Regex.Split(morph.region, "/");
                        string morphUpperRegion = "";

                        foreach (string posePath in posePaths)
                        {
                            morphUpperRegion = posePath;
                        }

                        LastRegions.Add(morphUpperRegion);
                        toggleRelations[name]  = morphUpperRegion;
                        temporaryToggles[name] = morphUpperRegion + "/" + name;
                    }
                });

                #region Region Helper Buttons
                UIDynamicButton selectAll = CreateButton("Select All", true);
                selectAll.button.onClick.AddListener(delegate() {
                    toggles.Values.ToList().ForEach((toggle) =>
                    {
                        toggle.toggle.isOn = true;
                    });
                });
                UIDynamicButton selectNone = CreateButton("Select None", true);
                selectNone.button.onClick.AddListener(delegate() {
                    toggles.Values.ToList().ForEach((toggle) =>
                    {
                        toggle.toggle.isOn = false;
                    });
                });

                foreach (string LastRegion in LastRegions)
                {
                    buttons[LastRegion] = CreateButton(LastRegion, true);
                    buttons[LastRegion].button.onClick.AddListener(delegate() {
                        ResetMorphs();
                        foreach (KeyValuePair <string, UIDynamicToggle> entry in toggles)
                        {
                            if (toggleRelations.ContainsKey(entry.Key))
                            {
                                entry.Value.toggle.isOn = (toggleRelations[entry.Key] == LastRegion);
                            }
                        }
                    });
                }
                #endregion

                #region Region checkbox generation
                foreach (KeyValuePair <string, string> entry in temporaryToggles)
                {
                    JSONStorableBool checkBoxTick = new JSONStorableBool(entry.Value, false);
                    checkBoxTick.storeType = JSONStorableParam.StoreType.Full;
                    RegisterBool(checkBoxTick);

                    toggles[entry.Key] = CreateToggle(checkBoxTick, true);
                }
                #endregion

                #endregion

                #region Play Loop

                new Thread(() =>
                {
                    Thread.CurrentThread.IsBackground = true;

                    while (true)
                    {
                        if (toggles["Play"].toggle.isOn)
                        {
                            // define the random values to switch to
                            morphControl.GetMorphDisplayNames().ForEach((name) =>
                            {
                                DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                                if (toggles.ContainsKey(name) == false)
                                {
                                    return;
                                }

                                if (toggles[name].toggle.isOn)
                                {
                                    if (morph.animatable == false)
                                    {
                                        float valeur         = UnityEngine.Random.Range(minSlider.val, maxSlider.val) * multiSlider.val;
                                        newMorphValues[name] = valeur;
                                    }
                                }
                            });

                            // morph progressively every morphs to their new values
                            int etape = (int)(1000 * animLengthSlider.val / 60);
                            for (int i = 0; i < etape; i++)
                            {
                                morphControl.GetMorphDisplayNames().ForEach((name) =>
                                {
                                    DAZMorph morph = morphControl.GetMorphByDisplayName(name);
                                    if (toggles.ContainsKey(name) == false)
                                    {
                                        return;
                                    }

                                    if (toggles[name].toggle.isOn)
                                    {
                                        if (morph.animatable == false)
                                        {
                                            morph.morphValue += ((newMorphValues[name] - CurrentMorphsValues[name]) / (etape)) * 0.99f;
                                        }
                                    }
                                });
                                System.Threading.Thread.Sleep((int)(1000 * animLengthSlider.val / 60));
                            }
                            // update current state without touching the initial value for later reset
                            UpdateCurrentMorphs();
                        }
                        // sleep so no fast empty loop if no morph has been selected
                        System.Threading.Thread.Sleep((int)(100));
                    }
                }).Start();
                #endregion

                //CreateSpacer();

                #region SetAsDef button
                UIDynamicButton setasdefButton = CreateButton("Set current as default", false);
                setasdefButton.button.onClick.AddListener(delegate()
                {
                    UpdateInitialMorphs();
                });
                #endregion

                UIDynamicButton animatableButton = CreateButton("Clear Animatable", false);
                animatableButton.button.onClick.AddListener(delegate()
                {
                    morphControl.GetMorphDisplayNames().ForEach((name) =>
                    {
                        DAZMorph morph   = morphControl.GetMorphByDisplayName(name);
                        morph.animatable = false;
                    });
                });

                #region Reset button
                UIDynamicButton resetButton = CreateButton("Reset", false);
                resetButton.button.onClick.AddListener(delegate()
                {
                    ResetMorphs();
                });
                #endregion


                animLengthSlider           = new JSONStorableFloat("Loop Length (s)", 3.0f, 0.01f, 10f, true);
                animLengthSlider.storeType = JSONStorableParam.StoreType.Full;
                RegisterFloat(animLengthSlider);
                CreateSlider(animLengthSlider, false);
            }
            catch (Exception e) {
                SuperController.LogError("Exception caught: " + e);
            }
        }