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; } }
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; }); }
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; }
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; }
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); } }
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"); }
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); }
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); }
public DAZCharacterSelector GetCharacter() { JSONStorable geometryStorable = containingAtom.GetStorableByID("geometry"); if (geometryStorable != null) { DAZCharacterSelector geometry = geometryStorable as DAZCharacterSelector; if (geometry != null) { return(geometry); } } return(null); }
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]; } }); }
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()); }
// 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); } }
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]; }); }
/// <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); }
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)); } }
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); }
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; }
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); } }
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()); }
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(); }
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); }
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); } }
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; } } } }
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(); } }
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); }
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); }
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); } }
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); } }
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; }
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); } }