Beispiel #1
0
                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();
                }
Beispiel #3
0
                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);
                        }
                    }
                }
Beispiel #4
0
        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);
                }
            }
        }
Beispiel #5
0
        /// <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()