private void Awake()
    {
        if (_instance != null)
        {
            Destroy(this.gameObject);
        }
        else
        {
            _instance = this;
            types.ForEach(type =>
            {
                switch (type)
                {
                case StateType.JumpingJacks:
                    _sceneStates.Add(new JumpingJackState(jumpingJacks, jumpingJacksInstructionLabel,
                                                          jumpingScore));
                    break;

                case StateType.Baseball:
                    _sceneStates.Add(new BaseBallState(shootingMachines, baseballHitTrigger, baseBallInstructionlabel,
                                                       baseballScore, AvatarAnimator.GetComponent <BodyCalibrate>().Control, baseballBat));
                    break;

                case StateType.Punch:
                    _sceneStates.Add(new PunchingState(punchingBag, punchingInstructionlabel, punchScore));
                    break;
                }
            });
        }
    }
        private void OnEditModeChange(bool editMode)
        {
            if (editMode)
            {
                ForgetAvatar();
                _editAvatar      = UnityEngine.Object.Instantiate(Avatar);
                _editAvatar.name = Avatar.name + " (Edit-Mode)";

                Avatar.SetActive(false);
                Avatar.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector;
                _editAvatar.GetOrAddComponent <Animator>().runtimeAnimatorController = GmgAnimatorControllerHelper.CreateControllerWith(OriginalClips);
                _radialMenu.MainMenuPrefab();
                EditorApplication.DirtyHierarchyWindowSorting();
            }
            else
            {
                if (_editAvatar)
                {
                    UnityEngine.Object.DestroyImmediate(_editAvatar);
                }

                Avatar.SetActive(true);
                Avatar.hideFlags = HideFlags.None;

                AvatarAnimator.Update(1f);
                AvatarAnimator.runtimeAnimatorController = null;
                AvatarAnimator.Update(1f);
                InitForAvatar();
                EditorApplication.DirtyHierarchyWindowSorting();
            }
        }
 public override void SetValues(bool onCustomAnimation, int left, int right, int emote)
 {
     if (Editing.State)
     {
         return;
     }
     AvatarAnimator.SetInteger(_handGestureLeft, left);
     AvatarAnimator.SetInteger(_handGestureRight, right);
 }
Esempio n. 4
0
        private static void ReloadPoseVariables(GameObject newAvatar)
        {
            if (newAvatar)
            {
                _avatarAnimator = newAvatar.GetComponent <Animator>();
            }
            else
            {
                _avatarAnimator = null;
            }

            if (bones == null)
            {
                bones = new List <PoseEditorBone>();
            }
            bones.Clear();

            if (newAvatar && AvatarAnimator && AvatarAnimator.isHuman)
            {
                avatarPose = new HumanPose();

                SerialTransform st = newAvatar.transform;
                Vector3         avatarPos;

                avatarPoseHandler = new HumanPoseHandler(AvatarAnimator.avatar, AvatarAnimator.transform);
                avatarPoseHandler.GetHumanPose(ref avatarPose);

                avatarPos = st.position;
                newAvatar.transform.position = avatarPos;

                //Human bone transforms to compare against
                HashSet <Transform> humanBoneTransforms = new HashSet <Transform>();
                for (int i = 0; i < HumanTrait.BoneCount; i++)
                {
                    humanBoneTransforms.Add(AvatarAnimator.GetBoneTransform((HumanBodyBones)i));
                }

                //Get bone human bone root and tip positions
                for (int i = 0; i < HumanTrait.BoneCount; i++)
                {
                    Transform bone = AvatarAnimator.GetBoneTransform((HumanBodyBones)i);
                    if (!bone || bone.childCount == 0)
                    {
                        continue;
                    }
                    for (int j = 0; j < bone.childCount; j++)
                    {
                        Transform child = bone.GetChild(j);
                        if (humanBoneTransforms.Contains(child))
                        {
                            bones.Add(new PoseEditorBone(bone, child));
                        }
                    }
                }
            }
        }
 public override void SetValues(bool onCustomAnimation, int left, int right, int emote)
 {
     if (onCustomAnimation)
     {
         AvatarAnimator.SetInteger(_handGestureLeft, 8);
         AvatarAnimator.SetInteger(_handGestureRight, 8);
         AvatarAnimator.SetInteger(_emoteHash, 9);
     }
     else if (emote != 0)
     {
         AvatarAnimator.SetInteger(_handGestureLeft, 8);
         AvatarAnimator.SetInteger(_handGestureRight, 8);
         AvatarAnimator.SetInteger(_emoteHash, emote);
     }
     else
     {
         AvatarAnimator.SetInteger(_handGestureLeft, left);
         AvatarAnimator.SetInteger(_handGestureRight, right);
         AvatarAnimator.SetInteger(_emoteHash, emote);
     }
 }
Esempio n. 6
0
        void OnGUI()
        {
            InitUI();

            GUILayout.Label("Facial Motion Capture", titleStyle);
            GUILayout.Space(20);

            if (!AvatarMakerInitializer.IsPlatformSupported())
            {
                EditorGUILayout.HelpBox("Avatar Maker plugin supports only Windows platform and works in the Editor mode.", MessageType.Error);
                return;
            }

            if (EditorApplication.isPlaying)
            {
                GUILayout.Space(20);
                EditorGUILayout.HelpBox("Avatar Maker plugin doesn't work in the Play mode.", MessageType.Error);
                return;
            }

            if (AvatarMakerInitializer.IsInitializationInProgress)
            {
                EditorGUILayout.HelpBox("Loading...", MessageType.Info);
                return;
            }

            if (!AvatarMakerInitializer.IsMotionCaptureSupported)
            {
                EditorGUILayout.HelpBox("Your CPU doesn't have AVX extension required for Motion Tracking.", MessageType.Error);
                return;
            }

            if (isEditAnimationMode)
            {
                if (animationModifier != null && animationModifier.IsValidAvatarAnimation)
                {
                    OnGuiEditAnimation();
                    return;
                }
                else
                {
                    isEditAnimationMode = false;
                }
            }

            if (avatarInfo == null)
            {
                if (isCapturing)
                {
                    avatarAnimator.StopCapturing();
                    avatarAnimator = null;
                    isCapturing    = false;
                }

                if (AnimationMode.InAnimationMode())
                {
                    ToggleAnimationMode();
                }

                EditorGUILayout.HelpBox(avatarErrorLabel, MessageType.Info);
                return;
            }

            scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);

            WebCamDevice[] cameraDevices = WebCamTexture.devices;
            if (cameraDevices != null && cameraDevices.Length > 0)
            {
                if (!isCapturing)
                {
                    if (cameraDevices.Length > 1)
                    {
                        string[] cameraNames = cameraDevices.Select(d => { return(d.name); }).ToArray();
                        cameraId = GUILayout.SelectionGrid(cameraId, cameraNames, 1, "toggle");
                    }
                    else
                    {
                        cameraId = 0;
                    }
                }

                EditorGUI.BeginDisabledGroup(avatarInfo == null);
                capturingButtonLabel = isCapturing ? "Stop capturing" : "Start capturing";
                isCapturing          = GUILayout.Toggle(isCapturing, capturingButtonLabel, "Button");
                EditorGUI.EndDisabledGroup();
            }
            else
            {
                EditorGUILayout.HelpBox("There is no available web camera.", MessageType.Info);
            }

            if (isCapturing)
            {
                capturingErrorLabel = string.Empty;
                if (avatarAnimator == null)
                {
                    avatarAnimator = new AvatarAnimator(avatarInfo.transform, avatarInfo.headMeshRenderer, cameraOffset);
                    isCapturing    = avatarAnimator.StartCapturing(WebCamTexture.devices[cameraId].name, avatarInfo.code);
                    if (!isCapturing)
                    {
                        capturingErrorLabel = "Unable to start motion capture.";
                        Debug.LogError(capturingErrorLabel);
                        avatarAnimator = null;
                        return;
                    }
                    ApplyBlendshapesImpact();

                    if (AvatarAnimator.RecordAtStart)
                    {
                        StartRecording();
                    }

                    if (AnimationMode.InAnimationMode())
                    {
                        ToggleAnimationMode();
                    }
                }
                Texture2D tex = avatarAnimator.HandleCapturedFrame();
                DisplayFrameTexture(tex);
            }
            else
            {
                if (avatarAnimator != null)
                {
                    avatarAnimator.StopCapturing();
                    avatarAnimator = null;
                }
            }

            if (!string.IsNullOrEmpty(capturingErrorLabel))
            {
                EditorGUILayout.HelpBox(capturingErrorLabel, MessageType.Error);
            }
            GUILayout.Space(20);

            EditorGUILayout.BeginVertical("Box");
            {
                EditorGUILayout.LabelField("Recording options", titleStyle);
                GUILayout.Space(5);
                if (isCapturing)
                {
                    recordingButtonLabel = avatarAnimator.IsRecording ? "Stop recording" : "Start recording";
                    if (avatarAnimator.IsRecording != GUILayout.Toggle(avatarAnimator.IsRecording, recordingButtonLabel, "Button"))
                    {
                        if (avatarAnimator.IsRecording)
                        {
                            StopRecording();
                        }
                        else
                        {
                            StartRecording();
                        }
                    }
                    GUILayout.Space(5);
                }

                AvatarAnimator.RecordAtStart = GUILayout.Toggle(AvatarAnimator.RecordAtStart, "Record at start");

                recordedAnimationClip = (AnimationClip)EditorGUILayout.ObjectField("Animation file: ", recordedAnimationClip, typeof(AnimationClip), false);

                AvatarAnimator.ApplyTranslation = GUILayout.Toggle(AvatarAnimator.ApplyTranslation, "Capture translation");
                AvatarAnimator.ApplyRotation    = GUILayout.Toggle(AvatarAnimator.ApplyRotation, "Capture rotation");
            }
            EditorGUILayout.EndVertical();
            GUILayout.Space(10);

            OnGuiPlayingAnimation();

            if (!string.IsNullOrEmpty(exportErrorLabel))
            {
                EditorGUILayout.HelpBox(exportErrorLabel, MessageType.Error);
                ShowAvatarMakerProLink();
            }
            GUILayout.Space(10);

            showBlendshapeCoefficients = EditorGUILayout.Foldout(showBlendshapeCoefficients, "Blendshapes Impact");
            if (showBlendshapeCoefficients)
            {
                if (blendshapesImpactControls.Count == 0)
                {
                    List <string> blendshapeNames = AvatarAnimator.GetBlendshapesNames();
                    for (int i = 0; i < blendshapeNames.Count; i++)
                    {
                        blendshapesImpactControls.Add(blendshapeNames[i], new SliderWithTextValues(1.0f));
                        blendshapesImpactValues.Add(blendshapeNames[i], 1f);
                    }
                }

                blendshapesScrollPosition = GUILayout.BeginScrollView(blendshapesScrollPosition, GUILayout.Height(Mathf.Max(200f, position.height - 200f)));
                var blendshapesNames = blendshapesImpactControls.Keys.ToList <string>();
                for (int i = 0; i < blendshapesNames.Count; i++)
                {
                    SliderWithTextValues controlsValues = blendshapesImpactControls[blendshapesNames[i]];

                    GUILayout.BeginHorizontal();
                    GUILayout.Label(blendshapesNames[i] + ":", GUILayout.MaxWidth(100));
                    float blendshapeImpactVal = GUILayout.HorizontalSlider(controlsValues.sliderValue, 0, maxImpactValue);
                    if (blendshapeImpactVal != controlsValues.sliderValue)
                    {
                        controlsValues.SetValue(blendshapeImpactVal);
                        blendshapesImpactValues[blendshapesNames[i]] = blendshapeImpactVal;
                        ApplyBlendshapesImpact();
                    }

                    string modifiedValueStr = GUILayout.TextField(controlsValues.textValue, GUILayout.Width(100));
                    if (modifiedValueStr != blendshapeImpactVal.ToString())
                    {
                        controlsValues.textValue = modifiedValueStr;
                        if (float.TryParse(modifiedValueStr, out blendshapeImpactVal) && blendshapeImpactVal >= 0 && blendshapeImpactVal <= maxImpactValue)
                        {
                            controlsValues.sliderValue = blendshapeImpactVal;
                            blendshapesImpactValues[blendshapesNames[i]] = blendshapeImpactVal;
                            ApplyBlendshapesImpact();
                        }
                    }
                    GUILayout.EndHorizontal();
                }
                GUILayout.Space(10);
                GUILayout.BeginHorizontal();
                if (GUILayout.Button("Save", buttonSkin))
                {
                    SaveBlendshapesImpactValues();
                }
                if (GUILayout.Button("Load", buttonSkin))
                {
                    LoadBlendshapesImpactValues();
                }
                GUILayout.EndHorizontal();
                GUILayout.Space(10);
                GUILayout.EndScrollView();
            }

            EditorGUILayout.EndScrollView();

            if (isCapturing)
            {
                Repaint();
            }
        }
Esempio n. 7
0
        private void OnGuiPlayingAnimation()
        {
            if (!isCapturing)
            {
                EditorGUILayout.BeginVertical("Box");
                {
                    EditorGUILayout.LabelField("Animation", titleStyle);
                    GUILayout.Space(5);

                    playingAnimationClip = (AnimationClip)EditorGUILayout.ObjectField("Animation to play: ", playingAnimationClip, typeof(AnimationClip), false);

                    if (playingAnimationClip != null)
                    {
                        EditorGUI.BeginChangeCheck();
                        GUILayout.Toggle(AnimationMode.InAnimationMode(), "Play recorded animation");
                        if (EditorGUI.EndChangeCheck())
                        {
                            ToggleAnimationMode();
                        }

                        if (AnimationMode.InAnimationMode())
                        {
                            isAutoPlayAnimation = GUILayout.Toggle(isAutoPlayAnimation, "Automatically play in loop");

                            animationTime = EditorGUILayout.Slider(animationTime, 0.0f, playingAnimationClip.length);
                        }

                        GUILayout.BeginHorizontal();
                        {
                            if (GUILayout.Button("Export to FBX"))
                            {
                                if (AvatarMakerInitializer.IsProVersion)
                                {
                                    string fbxFilePath = Export.ExportAvatarAsFbx(avatarInfo, true);
                                    if (!string.IsNullOrEmpty(fbxFilePath))
                                    {
                                        int result = AvatarAnimator.AddAnimationToFbx(fbxFilePath, playingAnimationClip);
                                        if (result != 0)
                                        {
                                            Debug.LogErrorFormat("Unable to create FBX animation: {0}", result);
                                        }
                                    }
                                }
                                else
                                {
                                    exportErrorLabel = "FBX export is available only in the Avatar Maker Pro version!";
                                }
                            }

                            if (GUILayout.Button("Edit"))
                            {
                                animationModifier = new AnimationClipModifier(playingAnimationClip);
                                if (animationModifier.IsValidAvatarAnimation)
                                {
                                    isEditAnimationMode = true;
                                    Repaint();
                                }
                                else
                                {
                                    EditorUtility.DisplayDialog("Error", "This animation can't be modified.", "OK");
                                }
                            }
                        }
                        GUILayout.EndHorizontal();
                    }
                }
                EditorGUILayout.EndVertical();
                GUILayout.Space(10);
            }
        }
 private void ForgetAvatar()
 {
     AvatarAnimator.Rebind();
     RadialMenu.ForgetParams();
     DestroyGraphs();
 }
 public void ResetAvatar()
 {
     AvatarAnimator.Rebind();
     InitForAvatar();
 }