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); }
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); } }
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(); } }
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(); }