Beispiel #1
0
        public void ChangeValue(float value)
        {
            if (_dnr == null)             //No specified DNA Range Asset for this DNA
            {
                _Owner.SetValue(_Index, value);
                _Avatar.ForceUpdate(true, false, false);
                return;
            }

            if (_dnr.ValueInRange(_Index, value))
            {
                _Owner.SetValue(_Index, value);
                _Avatar.ForceUpdate(true, false, false);
                return;
            }
            else
            {
                //Debug.LogWarning ("DNA Value out of range!");
            }
        }
Beispiel #2
0
        public void SetEarMorph(float value)
        {
            if (dna == null)
            {
                dna = data.GetDna(dnaTypeHash);
            }

            if (dna != null)
            {
                dna.SetValue(dnaEntryIndex, value);
                data.Dirty(true, false, false);
            }
        }
Beispiel #3
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);
            }
        }
Beispiel #4
0
 public void ChangeValue(float value)
 {
     _Owner.SetValue(_Index, value);
     _Avatar.ForceUpdate(true, false, false);
 }
Beispiel #5
0
 /// <summary>
 /// Set the current DNA value. You will need to rebuild the character to see
 /// the results change.
 /// </summary>
 public void Set(float val)
 {
     Value = val;
     Owner.SetValue(OwnerIndex, val);
 }