public void SetEyeShapeTables(List <EyeShapeTable> eyeShapeTables) { bool valid = true; if (eyeShapeTables == null) { valid = false; } else { for (int table = 0; table < eyeShapeTables.Count; ++table) { if (eyeShapeTables[table].skinnedMeshRenderer == null) { valid = false; break; } for (int shape = 0; shape < eyeShapeTables[table].eyeShapes.Length; ++shape) { EyeShape eyeShape = eyeShapeTables[table].eyeShapes[shape]; if (eyeShape > EyeShape.Max || eyeShape < 0) { valid = false; break; } } } } if (valid) { EyeShapeTables = eyeShapeTables; } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); Rect newFieldPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); newFieldPosition.height = EditorGUIUtility.singleLineHeight; Rect newLabelPosition = position; newLabelPosition.width -= newFieldPosition.width; SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer"); SerializedProperty propEyeShapes = property.FindPropertyRelative("eyeShapes"); EditorGUI.PropertyField(newFieldPosition, propSkinedMesh, GUIContent.none); newFieldPosition.y += EditorGUIUtility.singleLineHeight; SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer; if (skinnedMesh != null && skinnedMesh.sharedMesh.blendShapeCount > 0) { if (propEyeShapes.arraySize != skinnedMesh.sharedMesh.blendShapeCount) { propEyeShapes.arraySize = skinnedMesh.sharedMesh.blendShapeCount; for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i) { SerializedProperty propEyeShape = propEyeShapes.GetArrayElementAtIndex(i); string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i); propEyeShape.intValue = (int)EyeShape.None; foreach (EyeShape EyeShape in (EyeShape[])Enum.GetValues(typeof(EyeShape))) { if (elementName == EyeShape.ToString()) { propEyeShape.intValue = (int)EyeShape; } } } } for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i) { SerializedProperty propEyeShape = propEyeShapes.GetArrayElementAtIndex(i); newLabelPosition.y = newFieldPosition.y; string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i); EditorGUI.LabelField(newLabelPosition, " " + elementName); EditorGUI.PropertyField(newFieldPosition, propEyeShape, GUIContent.none); newFieldPosition.y += EditorGUIUtility.singleLineHeight; } } EditorGUI.EndProperty(); }
private void RenderModelEyeShape(EyeShapeTable eyeShapeTable, Dictionary <EyeShape, float> weighting) { for (int i = 0; i < eyeShapeTable.eyeShapes.Length; ++i) { EyeShape eyeShape = eyeShapeTable.eyeShapes[i]; if (eyeShape > EyeShape.Max || eyeShape < 0) { continue; } if (eyeShape == EyeShape.Eye_Left_Blink || eyeShape == EyeShape.Eye_Right_Blink) { eyeShapeTable.skinnedMeshRenderer.SetBlendShapeWeight(i, weighting[eyeShape] * 100f); } else { AnimationCurve curve = EyebrowAnimationCurves[(int)eyeShape]; eyeShapeTable.skinnedMeshRenderer.SetBlendShapeWeight(i, curve.Evaluate(weighting[eyeShape]) * 100f); } } }
public void UpdateEyeShapes(Dictionary <EyeShape, float> eyeWeightings) { if (UseEyelidMovements == false) { return; } if (LookTarget == null) { return; } foreach (var weightings in eyeWeightings) { EyeShape eyeShape = weightings.Key; if (eyeShape == EyeShape.Eye_Left_Blink) { faceController.SetBlink_L(weightings.Value); } else if (eyeShape == EyeShape.Eye_Right_Blink) { faceController.SetBlink_R(weightings.Value); } } }
/// <summary> /// Takes the current state and set the parameters to control the facial features. /// </summary> protected virtual void SetState(FaceState state) { float pupilSizeLeftTarget = 1.0f; float pupilSizeRightTarget = 1.0f; int milliseconds = (int)(Time.GameTimeTotalSeconds * 1000.0); switch (state) { case FaceState.Crazy: eyeShapeLeft = EyeShape.Open; eyeShapeRight = EyeShape.Squint; pupilSizeLeftTarget = 0.3f; pupilSizeRightTarget = 1.2f; browPositionLeft = BrowPosition.Up; browPositionRight = BrowPosition.Down; int brow = ((int)(Time.GameTimeTotalSeconds * 1000.0)) % 400 / 100; switch (brow) { case 0: browPositionRight = BrowPosition.Normal; break; case 1: browPositionRight = BrowPosition.Down; break; case 2: browPositionRight = BrowPosition.Normal; break; case 3: browPositionRight = BrowPosition.Up; break; } break; case FaceState.Happy: eyeShapeLeft = eyeShapeRight = EyeShape.Open; pupilSizeLeftTarget = pupilSizeRightTarget = 1.2f; // Wiggle the brows. if ((milliseconds % 200) > 100) { browPositionLeft = BrowPosition.Normal; } else { browPositionLeft = BrowPosition.Up; } if ((milliseconds % 200) > 120) { browPositionRight = BrowPosition.Normal; } else { browPositionRight = BrowPosition.Up; } break; case FaceState.Mad: eyeShapeLeft = eyeShapeRight = EyeShape.Squint; pupilSizeLeftTarget = pupilSizeRightTarget = 0.4f; browPositionLeft = browPositionRight = BrowPosition.Down; break; case FaceState.Sad: eyeShapeLeft = eyeShapeRight = EyeShape.Open; pupilSizeLeftTarget = pupilSizeRightTarget = 1.6f; browPositionLeft = browPositionRight = BrowPosition.Up; break; case FaceState.Remember: // Boku looks up and to the left like he's remembering. eyeShapeLeft = eyeShapeRight = EyeShape.Open; pupilSizeLeftTarget = pupilSizeRightTarget = 0.9f; browPositionLeft = browPositionRight = BrowPosition.Up; gazeState = GazeState.Fixed; gazeDuration = 0.01f; pupilOffsetLeft = new Vector2(-0.10f, 0.15f); pupilOffsetRight = pupilOffsetLeft; break; case FaceState.Squint: eyeShapeLeft = eyeShapeRight = EyeShape.Squint; pupilSizeLeftTarget = pupilSizeRightTarget = 0.9f; browPositionLeft = browPositionRight = BrowPosition.Up; break; case FaceState.Dead: eyeShapeLeft = EyeShape.Open; eyeShapeRight = EyeShape.Squint; pupilSizeLeftTarget = 0.5f; pupilSizeRightTarget = 0.5f; browPositionLeft = BrowPosition.Normal; browPositionRight = BrowPosition.Normal; pupilOffsetLeft = pupilOffsetRight = new Vector2(); gazeState = GazeState.Fixed; gazeDuration = float.MaxValue; break; default: eyeShapeLeft = eyeShapeRight = EyeShape.Open; pupilSizeLeftTarget = pupilSizeRightTarget = 1.0f; browPositionLeft = browPositionRight = BrowPosition.Normal; break; } // fire the change event so others can react if (newState && FaceChange != null) { FaceChange(state); } // A change of state may change the size of the pupils. If so, // launch a twitch to smoothly change the size. if (newState) { newState = false; if (pupilSizeLeft != pupilSizeLeftTarget) { TwitchManager.Set <float> set = delegate(float val, Object param) { pupilSizeLeft = val; }; TwitchManager.CreateTwitch <float>(pupilSizeLeft, pupilSizeLeftTarget, set, 0.2f, TwitchCurve.Shape.EaseInOut, null, null, true); } if (pupilSizeRight != pupilSizeRightTarget) { TwitchManager.Set <float> set = delegate(float val, Object param) { pupilSizeRight = val; }; TwitchManager.CreateTwitch <float>(pupilSizeRight, pupilSizeRightTarget, set, 0.2f, TwitchCurve.Shape.EaseInOut, null, null, true); } } } // end of Face SetState()