예제 #1
0
        private void SetBaseMesh(string assetPath)
        {
            var curDir = System.IO.Directory.GetCurrentDirectory().Replace('\\', '/');

            if (assetPath.StartsWith(curDir, System.StringComparison.InvariantCultureIgnoreCase))
            {
                assetPath = assetPath.Remove(0, curDir.Length + 1);
            }
            var asset = AssetDatabase.LoadMainAssetAtPath(assetPath);

            if (asset is GameObject)
            {
                RaceGO  = Instantiate(asset) as GameObject;
                RaceSMR = RaceGO.GetComponentInChildren <SkinnedMeshRenderer>();
                if (RaceSMR != null)
                {
                    if (SlotSMR != null)
                    {
                        PerformValidation();
                    }
                    else
                    {
                        NextPage();
                    }
                }
                else
                {
                    UMAUtils.DestroySceneObject(RaceGO);
                }
            }
        }
예제 #2
0
        public void ReplaceAll()
        {
            if (generateUMA || generateLotsUMA)
            {
                Debug.LogWarning("Can't replace while spawning.");
                return;
            }

            int childCount = gameObject.transform.childCount;

            while (--childCount >= 0)
            {
                Transform child = gameObject.transform.GetChild(childCount);
                UMAUtils.DestroySceneObject(child.gameObject);
            }

            if (umaCrowdSize.x <= 1 && umaCrowdSize.y <= 1)
            {
                generateUMA = true;
            }
            else
            {
                generateLotsUMA = true;
            }
        }
예제 #3
0
		static void ExportSelectionToSeparate()
		{
			for (int i = 0; i < Selection.gameObjects.Length; i++)
			{
				var selectedTransform = Selection.gameObjects[i].transform;
				var avatar = selectedTransform.GetComponent<UMAAvatarBase>();
				while (avatar == null && selectedTransform.parent != null)
				{
					selectedTransform = selectedTransform.parent;
					avatar = selectedTransform.GetComponent<UMAAvatarBase>();
				}

				if (avatar != null)
				{
					var path = EditorUtility.SaveFilePanel("Save obj static mesh", "Assets", avatar.name + ".obj", "obj");
					if (path.Length != 0)
					{
						var staticMesh = new Mesh();
						avatar.umaData.GetRenderer(0).BakeMesh(staticMesh);
						FileUtils.WriteAllText(path, MeshToString(staticMesh, avatar.umaData.GetRenderer(0).sharedMaterials));
						UMAUtils.DestroySceneObject(staticMesh);
					}
				}
			}
		}
예제 #4
0
        public static void SaveSelectedAvatarsTxt()
        {
            for (int i = 0; i < Selection.gameObjects.Length; i++)
            {
                var selectedTransform = Selection.gameObjects[i].transform;
                var avatar            = selectedTransform.GetComponent <UMAAvatarBase>();
                while (avatar == null && selectedTransform.parent != null)
                {
                    selectedTransform = selectedTransform.parent;
                    avatar            = selectedTransform.GetComponent <UMAAvatarBase>();
                }

                if (avatar != null)
                {
                    var path = EditorUtility.SaveFilePanel("Save serialized Avatar", "Assets", avatar.name + ".txt", "txt");
                    if (path.Length != 0)
                    {
                        var asset = ScriptableObject.CreateInstance <UMATextRecipe>();
                        //check if Avatar is DCS
                        if (avatar is UMA.CharacterSystem.DynamicCharacterAvatar)
                        {
                            asset.Save(avatar.umaData.umaRecipe, avatar.context, (avatar as DynamicCharacterAvatar).WardrobeRecipes, true);
                        }
                        else
                        {
                            asset.Save(avatar.umaData.umaRecipe, avatar.context);
                        }
                        System.IO.File.WriteAllText(path, asset.recipeString);
                        UMAUtils.DestroySceneObject(asset);
                    }
                }
            }
        }
        /// <summary>
        /// Remove any controls from the panels
        /// </summary>
        private void Cleanup()
        {
            if (GeneralHelpText != null)
            {
                GeneralHelpText.SetActive(false);
            }
            if (DnaHelpText != null)
            {
                DnaHelpText.SetActive(false);
            }
            if (WardrobeHelpText != null)
            {
                WardrobeHelpText.SetActive(false);
            }
            if (ColorsHelpText != null)
            {
                ColorsHelpText.SetActive(false);
            }

            foreach (Transform t in SlotPanel.transform)
            {
                UMAUtils.DestroySceneObject(t.gameObject);
            }
            foreach (Transform t in WardrobePanel.transform)
            {
                UMAUtils.DestroySceneObject(t.gameObject);
            }
        }
예제 #6
0
        public static void LoadSelectedAvatarsTxt()
        {
            for (int i = 0; i < Selection.gameObjects.Length; i++)
            {
                var selectedTransform = Selection.gameObjects[i].transform;
                var avatar            = selectedTransform.GetComponent <UMAAvatarBase>();
                while (avatar == null && selectedTransform.parent != null)
                {
                    selectedTransform = selectedTransform.parent;
                    avatar            = selectedTransform.GetComponent <UMAAvatarBase>();
                }

                if (avatar != null)
                {
                    var path = EditorUtility.OpenFilePanel("Load serialized Avatar", "Assets", "txt");
                    if (path.Length != 0)
                    {
                        var asset = ScriptableObject.CreateInstance <UMATextRecipe>();
                        asset.recipeString = FileUtils.ReadAllText(path);
                        //check if Avatar is DCS
                        if (avatar is DynamicCharacterAvatar)
                        {
                            (avatar as DynamicCharacterAvatar).LoadFromRecipeString(asset.recipeString);
                        }
                        else
                        {
                            avatar.Load(asset);
                        }

                        UMAUtils.DestroySceneObject(asset);
                    }
                }
            }
        }
 private void Cleanup()
 {
     foreach (Transform t in ColorPanel.transform)
     {
         UMAUtils.DestroySceneObject(t.gameObject);
     }
 }
 private void Cleanup()
 {
     foreach (Transform t in ColorPanel.transform)
     {
         UMAUtils.DestroySceneObject(t.gameObject);
     }
     colorButtonsController.ClearActiveButtons();
 }
예제 #9
0
 /// <summary>
 ///
 /// </summary>
 private void Cleanup()
 {
     if (SelectionPanel.transform.childCount > 0)
     {
         foreach (Transform t in SelectionPanel.transform)
         {
             UMAUtils.DestroySceneObject(t.gameObject);
         }
     }
 }
        void umaData_OnCharacterUpdated(UMAData umaData)
        {
            var expressionPlayer = umaData.GetComponent <UMAExpressionPlayer>();

            if (expressionPlayer.SlotUpdateVsCharacterUpdate-- == 0)
            {
                UMAUtils.DestroySceneObject(expressionPlayer);
                umaData.CharacterUpdated.RemoveListener(new UnityAction <UMAData>(umaData_OnCharacterUpdated));
                return;
            }
        }
예제 #11
0
 private void Cleanup()
 {
     foreach (Transform t in SlotPanel.transform)
     {
         UMAUtils.DestroySceneObject(t.gameObject);
     }
     foreach (Transform t in WardrobePanel.transform)
     {
         UMAUtils.DestroySceneObject(t.gameObject);
     }
 }
예제 #12
0
 public void SelectNewBaseMesh()
 {
     if (forcedSlotBones)
     {
         UMAUtils.DestroySceneObject(SlotGO);
         SlotGO          = Instantiate(slotAsset) as GameObject;
         SlotSMR         = SlotGO.GetComponentInChildren <SkinnedMeshRenderer>();
         forcedSlotBones = false;
     }
     UMAUtils.DestroySceneObject(RaceGO);
     SetPage(0);
 }
예제 #13
0
 public void OnCharacterUpdate(UMA.UMAData data)
 {
     foreach (var componentName in removeComponentNames)
     {
         var component = data.animator.GetComponent(componentName);
         UMAUtils.DestroySceneObject(component);
     }
     foreach (var componentName in disableComponentNames)
     {
         var behavior = (data.animator.GetComponent(componentName) as Behaviour);
         if (behavior != null)
         {
             behavior.enabled = false;
         }
     }
 }
예제 #14
0
        public void ReplaceAll()
        {
            if (generating)
            {
                Debug.LogWarning("Can't replace while generating.");
                return;
            }

            int childCount = gameObject.transform.childCount;

            while (--childCount >= 0)
            {
                Transform child = gameObject.transform.GetChild(childCount);
                UMAUtils.DestroySceneObject(child.gameObject);
            }

            generating = true;
        }
        public void ButtonFemale()
        {
            UMAUtils.DestroySceneObject(GameObject.Find("UMACrowd").transform.GetChild(0).gameObject);
            crowdHandle.ResetSpawnPos();
            GameObject myUma = crowdHandle.GenerateOneUMA(1);

            myUma.transform.localRotation = Quaternion.Euler(new Vector3(0, 180, 0));

            GetUMAData(myUma);

            if (bodyArea != 0)
            {
                float yPos = GameObject.Find("NoseMiddle").transform.position.y;
                myCamera.transform.position = new Vector3(0, yPos + 0.05f, -0.62f);

                if (bodyArea == 2)
                {
                    panel.Find("LowerHead/FacialHair").gameObject.SetActive(false);
                }
            }
        }
예제 #16
0
        public void Initialize(DynamicCharacterAvatar Avatar)
        {
            foreach (GameObject go in CreatedObjects)
            {
                UMAUtils.DestroySceneObject(go);
            }
            CreatedObjects.Clear();

            UMADnaBase[] DNA = Avatar.GetAllDNA();

            List <DNAHolder> ValidDNA = new List <DNAHolder>();

            foreach (UMADnaBase d in DNA)
            {
                string[] names  = d.Names;
                float[]  values = d.Values;

                for (int i = 0; i < names.Length; i++)
                {
                    string name = names[i];
                    if (IsThisCategory(name.ToLower()))
                    {
                        ValidDNA.Add(new DNAHolder(name, values[i], i, d));
                    }
                }
            }

            ValidDNA.Sort( );

            foreach (DNAHolder dna in ValidDNA)
            {
                GameObject go = GameObject.Instantiate(DnaEditor);
                go.transform.SetParent(ContentArea.transform);
                go.transform.localScale = new Vector3(1f, 1f, 1f);                //Set the scale back to 1
                DNAEditor de = go.GetComponentInChildren <DNAEditor>();
                de.Initialize(dna.name.BreakupCamelCase(), dna.index, dna.dnaBase, Avatar, dna.value);
                go.SetActive(true);
                CreatedObjects.Add(go);
            }
        }
예제 #17
0
        private void CreateBonePoseCallback(UMAData umaData)
        {
            UMA.PoseTools.UMABonePose bonePose = CreatePoseAsset("", bonePoseSaveName);
            //I dont think this should have ever overwritten the existing one

            /*if (selectedConverter.startingPose == null)
             * {
             *      bonePose = CreatePoseAsset("", bonePoseSaveName);
             * }
             * else
             * {
             *      bonePose = selectedConverter.startingPose;
             *      bonePose.poses = new UMABonePose.PoseBone[1];
             * }*/

            UMASkeleton skeletonPreDNA  = tempAvatarPreDNA.GetComponent <UMADynamicAvatar>().umaData.skeleton;
            UMASkeleton skeletonPostDNA = tempAvatarPostDNA.GetComponent <UMADynamicAvatar>().umaData.skeleton;

            Transform transformPreDNA;
            Transform transformPostDNA;
            bool      transformDirty;
            int       parentHash;

            foreach (int boneHash in skeletonPreDNA.BoneHashes)
            {
                skeletonPreDNA.TryGetBoneTransform(boneHash, out transformPreDNA, out transformDirty, out parentHash);
                skeletonPostDNA.TryGetBoneTransform(boneHash, out transformPostDNA, out transformDirty, out parentHash);

                if ((transformPreDNA == null) || (transformPostDNA == null))
                {
                    Debug.LogWarning("Bad bone hash in skeleton: " + boneHash);
                    continue;
                }

                if (!LocalTransformsMatch(transformPreDNA, transformPostDNA))
                {
                    bonePose.AddBone(transformPreDNA, transformPostDNA.localPosition, transformPostDNA.localRotation, transformPostDNA.localScale);
                }
            }

            UMAUtils.DestroySceneObject(tempAvatarPreDNA);
            UMAUtils.DestroySceneObject(tempAvatarPostDNA);


            // This can be very helpful for testing

            /*
             * bonePose.ApplyPose(skeletonPreDNA, 1.0f);
             */

            EditorUtility.SetDirty(bonePose);
            AssetDatabase.SaveAssets();

            if (_applyAndResetOnCreateBP)
            {
                DynamicDNAConverterController converterController = (selectedConverter is DynamicDNAConverterController) ? (selectedConverter as DynamicDNAConverterController) : null;
                DynamicDNAConverterBehaviour  converterBehaviour  = (selectedConverter is DynamicDNAConverterBehaviour) ? (selectedConverter as DynamicDNAConverterBehaviour) : null;
                //UMA2.8+ fixDNAPrefabs Removed the converterBehaviour.ConverterController field, it should be directly assigned to the Races/Slots now
                //if (converterBehaviour.ConverterController != null)
                //	converterController = converterBehaviour.ConverterController;
                if (converterController != null)
                {
                    //find the first BonePoseDNAConverterPlugin and add the pose to it
                    var existingBPCPs = converterController.GetPlugins(typeof(BonePoseDNAConverterPlugin));
                    BonePoseDNAConverterPlugin thisBPCP;
                    if (existingBPCPs.Count > 0)
                    {
                        thisBPCP = existingBPCPs[0] as BonePoseDNAConverterPlugin;
                        //Turn off any other starting poses?
                        for (int i = 0; i < existingBPCPs.Count; i++)
                        {
                            for (int bi = 0; bi < (existingBPCPs[i] as BonePoseDNAConverterPlugin).poseDNAConverters.Count; bi++)
                            {
                                (existingBPCPs[i] as BonePoseDNAConverterPlugin).poseDNAConverters[bi].startingPoseWeight = 0f;
                            }
                        }
                    }
                    else
                    {
                        //if there isn't one create it
                        thisBPCP = converterController.AddPlugin(typeof(BonePoseDNAConverterPlugin)) as BonePoseDNAConverterPlugin;
                    }
                    thisBPCP.poseDNAConverters.Add(new BonePoseDNAConverterPlugin.BonePoseDNAConverter(bonePose, 1f));
                    Debug.Log(bonePose.name + " added as a starting pose to " + thisBPCP.name);
                }
                else if (converterBehaviour != null)
                {
                    // Set this asset as the converters pose asset
                    converterBehaviour.startingPose = bonePose;
                    //make sure its fully applied
                    converterBehaviour.startingPoseWeight = 1f;
                }

                // Reset all the DNA values for target Avatar to default
                UMADnaBase[] targetDNA = activeUMA.umaData.GetAllDna();
                foreach (UMADnaBase dnaEntry in targetDNA)
                {
                    for (int i = 0; i < dnaEntry.Values.Length; i++)
                    {
                        dnaEntry.SetValue(i, 0.5f);
                    }
                }

                // Optionally clear the DNA from the base recipe,
                // since it's now included in the new starting pose
                UMARecipeBase baseRaceRecipe = activeUMA.umaData.umaRecipe.GetRace().baseRaceRecipe;
                if (baseRaceRecipe != null)
                {
                    if (EditorUtility.DisplayDialog("Base Recipe Cleanup", "Starting Pose created. Remove DNA from base recipe of active race? Choose 'RemoveDNA' if your intention is to replace modifications made by a recipes starting DNA values with the created pose.", "Remove DNA", "Keep DNA"))
                    {
                        UMAData.UMARecipe baseRecipeData = new UMAData.UMARecipe();
                        baseRaceRecipe.Load(baseRecipeData, activeUMA.context);
                        baseRecipeData.ClearDna();
                        baseRaceRecipe.Save(baseRecipeData, activeUMA.context);
                    }
                }
            }
        }
예제 #18
0
        // This code is generally the same as used in the DynamicDNAConverterCustomizer
        // Probably worth breaking it out at some point and having it geenric
        protected void CreateBonePoseCallback(UMAData umaData)
        {
            avatarDNAisDirty = false;
            UMABonePose bonePose = ScriptableObject.CreateInstance <UMABonePose>();

            UMAData     umaPreDNA       = tempAvatarPreDNA.GetComponent <UMADynamicAvatar>().umaData;
            UMAData     umaPostDNA      = tempAvatarPostDNA.GetComponent <UMADynamicAvatar>().umaData;
            UMADnaBase  activeDNA       = umaPostDNA.umaRecipe.GetDna(selectedDNAHash);
            UMASkeleton skeletonPreDNA  = umaPreDNA.skeleton;
            UMASkeleton skeletonPostDNA = umaPostDNA.skeleton;

            if (poseSaveIndex < 0)
            {
                poseSaveName = startingPoseName;

                // Now that StartingPose has been generated
                // add the active DNA to the pre DNA avatar
                // UMA2.8+ Lots of converters can use the same DNA now
                //UMA2.8+ FixDNAPrefabs raceData.GetConverter(s) now returns IDNAConverter([])
                IDNAConverter[] activeConverters = sourceUMA.umaRecipe.raceData.GetConverters(sourceUMA.umaRecipe.GetDna(selectedDNAHash));
                //umaPreDNA.umaRecipe.raceData.dnaConverterList = new DnaConverterBehaviour[1];
                //umaPreDNA.umaRecipe.raceData.dnaConverterList[0] = activeConverter;
                umaPreDNA.umaRecipe.raceData.dnaConverterList = activeConverters;
                umaPreDNA.umaRecipe.raceData.UpdateDictionary();
                umaPreDNA.umaRecipe.EnsureAllDNAPresent();
                umaPreDNA.Dirty(true, false, true);
            }

            Transform transformPreDNA;
            Transform transformPostDNA;
            bool      transformDirty;
            int       parentHash;

            foreach (int boneHash in skeletonPreDNA.BoneHashes)
            {
                skeletonPreDNA.TryGetBoneTransform(boneHash, out transformPreDNA, out transformDirty, out parentHash);
                skeletonPostDNA.TryGetBoneTransform(boneHash, out transformPostDNA, out transformDirty, out parentHash);

                if ((transformPreDNA == null) || (transformPostDNA == null))
                {
                    Debug.LogWarning("Bad bone hash in skeleton: " + boneHash);
                    continue;
                }

                if (!LocalTransformsMatch(transformPreDNA, transformPostDNA))
                {
                    bonePose.AddBone(transformPreDNA, transformPostDNA.localPosition, transformPostDNA.localRotation, transformPostDNA.localScale);
                }
            }

            int activeDNACount = activeDNA.Count;

            for (int i = 0; i < activeDNACount; i++)
            {
                activeDNA.SetValue(i, 0.5f);
            }

            AssetDatabase.CreateAsset(bonePose, folderPath + "/" + poseSaveName + ".asset");
            EditorUtility.SetDirty(bonePose);
            AssetDatabase.SaveAssets();

            poseSaveIndex++;
            if (poseSaveIndex < activeDNACount)
            {
                poseSaveName = activeDNA.Names[poseSaveIndex] + "_0";
                activeDNA.SetValue(poseSaveIndex, 0.0f);
                avatarDNAisDirty = true;
            }
            else if (poseSaveIndex < (activeDNACount * 2))
            {
                int dnaIndex = poseSaveIndex - activeDNACount;
                poseSaveName = activeDNA.Names[dnaIndex] + "_1";
                activeDNA.SetValue(dnaIndex, 1.0f);
                umaPostDNA.Dirty();
                avatarDNAisDirty = true;
            }
            else
            {
                UMAUtils.DestroySceneObject(tempAvatarPreDNA);
                UMAUtils.DestroySceneObject(tempAvatarPostDNA);

                // Build a prefab DNA Converter and populate it with the morph set
                string assetName = "Morph Set";
                string assetPath = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + assetName + ".asset");

                MorphSetDnaAsset asset           = CustomAssetUtility.CreateAsset <MorphSetDnaAsset>(assetPath, false);
                SerializedObject serializedAsset = new SerializedObject(asset);

                SerializedProperty startingPose = serializedAsset.FindProperty("startingPose");
                startingPose.objectReferenceValue = AssetDatabase.LoadAssetAtPath <UMABonePose>(folderPath + "/" + startingPoseName + ".asset");

                SerializedProperty morphSetArray = serializedAsset.FindProperty("dnaMorphs");
                morphSetArray.ClearArray();
                for (int i = 0; i < activeDNACount; i++)
                {
                    string posePairName = activeDNA.Names[i];

                    morphSetArray.InsertArrayElementAtIndex(i);
                    SerializedProperty posePair = morphSetArray.GetArrayElementAtIndex(i);

                    SerializedProperty dnaEntryName = posePair.FindPropertyRelative("dnaEntryName");
                    dnaEntryName.stringValue = posePairName;
                    SerializedProperty zeroPose = posePair.FindPropertyRelative("poseZero");
                    zeroPose.objectReferenceValue = AssetDatabase.LoadAssetAtPath <UMABonePose>(folderPath + "/" + posePairName + "_0.asset");
                    SerializedProperty onePose = posePair.FindPropertyRelative("poseOne");
                    onePose.objectReferenceValue = AssetDatabase.LoadAssetAtPath <UMABonePose>(folderPath + "/" + posePairName + "_1.asset");
                }
                serializedAsset.ApplyModifiedPropertiesWithoutUndo();

                // Build a prefab DNA Converter and populate it with the morph set
                string prefabName = "Converter Prefab";
                string prefabPath = AssetDatabase.GenerateUniqueAssetPath(folderPath + "/" + prefabName + ".prefab");

                GameObject tempConverterPrefab          = new GameObject(prefabName);
                MorphSetDnaConverterBehaviour converter = tempConverterPrefab.AddComponent <MorphSetDnaConverterBehaviour>();
                SerializedObject serializedConverter    = new SerializedObject(converter);

                SerializedProperty morphSet = serializedAsset.FindProperty("morphSet");
                morphSet.objectReferenceValue = AssetDatabase.LoadAssetAtPath <MorphSetDnaAsset>(assetPath);

                serializedConverter.ApplyModifiedPropertiesWithoutUndo();
#if UNITY_2018_3_OR_NEWER
                PrefabUtility.SaveAsPrefabAsset(tempConverterPrefab, prefabPath);
#else
                PrefabUtility.CreatePrefab(prefabPath, tempConverterPrefab);
#endif
                DestroyImmediate(tempConverterPrefab, false);
            }
        }
예제 #19
0
 public void SelectNewSlotMesh()
 {
     forcedSlotBones = false;
     UMAUtils.DestroySceneObject(SlotGO);
     SetPage(1);
 }
        protected void CreateBonePoseCallback(UMAData umaData)
        {
            UMA.PoseTools.UMABonePose bonePose = null;
            if (selectedConverter.startingPose == null)
            {
                bonePose = CreatePoseAsset("", bonePoseSaveName);
            }
            else
            {
                bonePose       = selectedConverter.startingPose;
                bonePose.poses = new UMABonePose.PoseBone[1];
            }

            UMASkeleton skeletonPreDNA  = tempAvatarPreDNA.GetComponent <UMADynamicAvatar>().umaData.skeleton;
            UMASkeleton skeletonPostDNA = tempAvatarPostDNA.GetComponent <UMADynamicAvatar>().umaData.skeleton;

            Transform transformPreDNA;
            Transform transformPostDNA;
            bool      transformDirty;
            int       parentHash;

            foreach (int boneHash in skeletonPreDNA.BoneHashes)
            {
                skeletonPreDNA.TryGetBoneTransform(boneHash, out transformPreDNA, out transformDirty, out parentHash);
                skeletonPostDNA.TryGetBoneTransform(boneHash, out transformPostDNA, out transformDirty, out parentHash);

                if ((transformPreDNA == null) || (transformPostDNA == null))
                {
                    Debug.LogWarning("Bad bone hash in skeleton: " + boneHash);
                    continue;
                }

                if (!LocalTransformsMatch(transformPreDNA, transformPostDNA))
                {
                    bonePose.AddBone(transformPreDNA, transformPostDNA.localPosition, transformPostDNA.localRotation, transformPostDNA.localScale);
                }
            }

            UMAUtils.DestroySceneObject(tempAvatarPreDNA);
            UMAUtils.DestroySceneObject(tempAvatarPostDNA);

            // This can be very helpful for testing

            /*
             * bonePose.ApplyPose(skeletonPreDNA, 1.0f);
             */

            EditorUtility.SetDirty(bonePose);
            AssetDatabase.SaveAssets();
            // Set this asset as the converters pose asset
            selectedConverter.startingPose = bonePose;
            //make sure its fully applied
            selectedConverter.startingPoseWeight = 1f;

            // Reset all the DNA values for target Avatar to default
            UMADnaBase[] targetDNA = activeUMA.umaData.GetAllDna();
            foreach (UMADnaBase dnaEntry in targetDNA)
            {
                for (int i = 0; i < dnaEntry.Values.Length; i++)
                {
                    dnaEntry.SetValue(i, 0.5f);
                }
            }

            // Optionally clear the DNA from the base recipe,
            // since it's now included in the new starting pose
            UMARecipeBase baseRaceRecipe = activeUMA.umaData.umaRecipe.GetRace().baseRaceRecipe;

            if (baseRaceRecipe != null)
            {
                if (EditorUtility.DisplayDialog("Base Recipe Cleanup", "Starting Pose created. Remove DNA from base recipe of active race?", "Remove DNA", "Keep DNA"))
                {
                    UMAData.UMARecipe baseRecipeData = new UMAData.UMARecipe();
                    baseRaceRecipe.Load(baseRecipeData, activeUMA.context);
                    baseRecipeData.ClearDna();
                    baseRaceRecipe.Save(baseRecipeData, activeUMA.context);
                }
            }
        }