Ejemplo n.º 1
0
    public override void PostUpdate(DirectorControlState state, bool inArea, EventType type)
    {
        CinemaActorClipCurve clipCurve = Wrapper.Behaviour as CinemaActorClipCurve;

        if (clipCurve == null)
        {
            return;
        }

        hasUndoRedoBeenPerformed = (Event.current.type == EventType.ValidateCommand && Event.current.commandName == "UndoRedoPerformed");
        if ((HaveCurvesChanged || hasUndoRedoBeenPerformed) && state.IsInPreviewMode)
        {
            clipCurve.SampleTime(state.ScrubberPosition);
            HaveCurvesChanged = false;
            hasUserInteracted = false;
        }
        else
        {
            if (state.IsInPreviewMode && IsEditing && GUIUtility.hotControl == 0 && (clipCurve.Firetime <= state.ScrubberPosition && state.ScrubberPosition <= clipCurve.Firetime + clipCurve.Duration) && clipCurve.Actor != null)
            {
                inArea = !(Event.current.shift && Event.current.keyCode == KeyCode.F && Event.current.control);
                checkToAddNewKeyframes(clipCurve, state, EditorWindow.focusedWindow == DirectorWindow.Instance && inArea);
            }
        }
    }
Ejemplo n.º 2
0
    public void AddClipCurveDataRotation(CinemaActorClipCurve curveData, EditorCurveBinding component, bool isProperty, AnimationCurve curve, Component com)
    {
        MemberClipCurveData data = new MemberClipCurveData();

        data.SetCurve(0, curve);
        data.Type         = component.type.Name;
        data.PropertyName = "localEulerAngles";
        data.IsProperty   = isProperty;
        data.PropertyType = PropertyTypeInfo.Vector3;
        curveData.curveData.Add(data);
    }
Ejemplo n.º 3
0
    protected override void showContextMenu(Behaviour behaviour)
    {
        CinemaActorClipCurve clipCurve = behaviour as CinemaActorClipCurve;

        if (clipCurve == null)
        {
            return;
        }

        List <KeyValuePair <string, string> > currentCurves = new List <KeyValuePair <string, string> >();
        {
            var __list1      = clipCurve.CurveData;
            var __listCount1 = __list1.Count;
            for (int __i1 = 0; __i1 < __listCount1; ++__i1)
            {
                var data = (MemberClipCurveData)__list1[__i1];
                {
                    KeyValuePair <string, string> curveStrings = new KeyValuePair <string, string>(data.Type, data.PropertyName);
                    currentCurves.Add(curveStrings);
                }
            }
        }
        GenericMenu createMenu = new GenericMenu();

        if (clipCurve.Actor != null)
        {
            Component[] components = DirectorHelper.getValidComponents(clipCurve.Actor.gameObject);

            for (int i = 0; i < components.Length; i++)
            {
                Component    component = components[i];
                MemberInfo[] members   = DirectorHelper.getValidMembers(component);
                for (int j = 0; j < members.Length; j++)
                {
                    AddCurveContext context = new AddCurveContext();
                    context.clipCurve  = clipCurve;
                    context.component  = component;
                    context.memberInfo = members[j];
                    if (!currentCurves.Contains(new KeyValuePair <string, string>(component.GetType().Name, members[j].Name)))
                    {
                        createMenu.AddItem(new GUIContent(string.Format("Add Curve/{0}/{1}", component.GetType().Name, DirectorHelper.GetUserFriendlyName(component, members[j]))), false, addCurve, context);
                    }
                }
            }
            createMenu.AddSeparator(string.Empty);
        }
        createMenu.AddItem(new GUIContent("Copy"), false, copyItem, behaviour);
        createMenu.AddSeparator(string.Empty);
        createMenu.AddItem(new GUIContent("Clear"), false, deleteItem, clipCurve);
        createMenu.ShowAsContext();
    }
Ejemplo n.º 4
0
    public void OnSceneGUI()
    {
        CinemaActorClipCurve clipCurveGameObject = (target as CinemaActorClipCurve);

        foreach (MemberClipCurveData data in clipCurveGameObject.CurveData)
        {
            if (data.Type == "Transform" && data.PropertyName == "localPosition")
            {
                //Vector3 position = new Vector3(data.Curve1[0].value, data.Curve2[0].value, data.Curve3[0].value);

                //Handles.DrawSphere(0, position, Quaternion.identity, 10);
            }
        }
    }
Ejemplo n.º 5
0
    protected void loadItem(object userData)
    {
        CinemaActorClipCurve behaviour = userData as CinemaActorClipCurve;

        if (behaviour != null)
        {
            Animator animator = behaviour.Actor.GetComponent <Animator>();
            if (animator == null)
            {
                EditorUtility.DisplayDialog("错误", "没有找到Animator组件", "确定");
                return;
            }

            AnimatorClipInfo[] clip = animator.GetCurrentAnimatorClipInfo(0);
            if (clip == null || clip.Length <= 0)
            {
                EditorUtility.DisplayDialog("错误", "没有找到animator资源", "确定");
                return;
            }

            var bind = AnimationUtility.GetCurveBindings(clip[0].clip);
            if (bind == null)
            {
                EditorUtility.DisplayDialog("错误", "没有找到bindings", "确定");
                return;
            }

            var curve = AnimationUtility.GetEditorCurve(clip[0].clip, bind[0]);
            if (curve == null)
            {
                EditorUtility.DisplayDialog("错误", "没有找到曲线", "确定");
                return;
            }
            behaviour.curveData.Clear();
            AddClipCurveData(behaviour, bind[0], true, curve, behaviour.Actor.transform);
            var data = AnimationUtility.GetEditorCurve(clip[0].clip, bind[1]);
            behaviour.curveData[0].SetCurve(1, data);
            data = AnimationUtility.GetEditorCurve(clip[0].clip, bind[2]);
            behaviour.curveData[0].SetCurve(2, data);

            curve = AnimationUtility.GetEditorCurve(clip[0].clip, bind[3]);

            AddClipCurveDataRotation(behaviour, bind[3], true, curve, behaviour.Actor.transform);
            data = AnimationUtility.GetEditorCurve(clip[0].clip, bind[4]);
            behaviour.curveData[1].SetCurve(1, data);
            data = AnimationUtility.GetEditorCurve(clip[0].clip, bind[5]);
            behaviour.curveData[1].SetCurve(2, data);
        }
    }
Ejemplo n.º 6
0
    /// <summary>
    /// Update and Draw the inspector
    /// </summary>
    public override void OnInspectorGUI()
    {
        curveTrack.Update();
        TimelineItem[] items = (target as CurveTrack).TimelineItems;
        for (int i = 0; i < items.Length; i++)
        {
            CinemaActorClipCurve clip = items[i] as CinemaActorClipCurve;
            EditorGUILayout.ObjectField(clip.name, clip, typeof(CinemaActorClipCurve), true);
        }

        if (GUILayout.Button(addClip))
        {
            Undo.RegisterCreatedObjectUndo(CutsceneItemFactory.CreateActorClipCurve((target as CurveTrack)).gameObject, "Create Curve Clip");
        }

        curveTrack.ApplyModifiedProperties();
    }
Ejemplo n.º 7
0
    public void OnSceneGUI()
    {
        CinemaActorClipCurve clipCurveGameObject = (target as CinemaActorClipCurve);
        {
            var __list1      = clipCurveGameObject.CurveData;
            var __listCount1 = __list1.Count;
            for (int __i1 = 0; __i1 < __listCount1; ++__i1)
            {
                var data = (MemberClipCurveData)__list1[__i1];
                {
                    if (data.Type == "Transform" && data.PropertyName == "localPosition")
                    {
                        //Vector3 position = new Vector3(data.Curve1[0].value, data.Curve2[0].value, data.Curve3[0].value);

                        //Handles.DrawSphere(0, position, Quaternion.identity, 10);
                    }
                }
            }
        }
    }
Ejemplo n.º 8
0
    public override void PostUpdate(DirectorControlState state)
    {
        CinemaActorClipCurve clipCurve = Wrapper.Behaviour as CinemaActorClipCurve;

        if (clipCurve == null)
        {
            return;
        }

        hasUndoRedoBeenPerformed = (Event.current.type == EventType.ValidateCommand && Event.current.commandName == "UndoRedoPerformed");
        if ((HaveCurvesChanged || hasUndoRedoBeenPerformed) && state.IsInPreviewMode)
        {
            clipCurve.SampleTime(state.ScrubberPosition);
            HaveCurvesChanged = false;
            hasUserInteracted = false;
        }
        else
        {
            checkToAddNewKeyframes(clipCurve, state);
        }
    }
Ejemplo n.º 9
0
    internal static CinemaActorClipCurve CreateActorClipCurve(CurveTrack track)
    {
        string     name = DirectorHelper.getCutsceneItemName(track.gameObject, CURVE_CLIP_NAME_DEFAULT, typeof(CinemaActorClipCurve));
        GameObject item = new GameObject(name);

        item.transform.parent = track.transform;
        CinemaActorClipCurve clip = item.AddComponent <CinemaActorClipCurve>();

        SortedDictionary <float, CinemaActorClipCurve> sortedItems = new SortedDictionary <float, CinemaActorClipCurve>();

        foreach (CinemaActorClipCurve c in track.TimelineItems)
        {
            sortedItems.Add(c.Firetime, c);
        }

        float latestTime = 0;
        float length     = DEFAULT_CURVE_LENGTH;

        foreach (CinemaActorClipCurve c in sortedItems.Values)
        {
            if (latestTime >= c.Firetime)
            {
                latestTime = Mathf.Max(latestTime, c.Firetime + c.Duration);
            }
            else
            {
                length = c.Firetime - latestTime;
                break;
            }
        }

        clip.Firetime = latestTime;
        clip.Duration = length;

        return(clip);
    }
Ejemplo n.º 10
0
    private void checkToAddNewKeyframes(CinemaActorClipCurve clipCurve, DirectorControlState state, bool inArea)
    {
        Undo.RecordObject(clipCurve, "Auto Key Created");
        bool hasDifferenceBeenFound = false;

        foreach (MemberClipCurveData data in clipCurve.CurveData)
        {
            if (data.Type == string.Empty || data.PropertyName == string.Empty)
            {
                continue;
            }

            Component component = clipCurve.Actor.GetComponent(data.Type);
            object    value     = CinemaActorClipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty);

            PropertyTypeInfo typeInfo = data.PropertyType;
            if (typeInfo == PropertyTypeInfo.Int || typeInfo == PropertyTypeInfo.Long || typeInfo == PropertyTypeInfo.Float || typeInfo == PropertyTypeInfo.Double)
            {
                float x           = (float)value;
                float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(x, curve1Value, data.Curve1, state.ScrubberPosition, inArea);
            }
            else if (typeInfo == PropertyTypeInfo.Vector2)
            {
                Vector2 vec2        = (Vector2)value;
                float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.x, curve1Value, data.Curve1, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.y, curve2Value, data.Curve2, state.ScrubberPosition, inArea);
            }
            else if (typeInfo == PropertyTypeInfo.Vector3)
            {
                Vector3 vec3        = (Vector3)value;
                float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                float   curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);

                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.x, curve1Value, data.Curve1, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.y, curve2Value, data.Curve2, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.z, curve3Value, data.Curve3, state.ScrubberPosition, inArea);
            }
            else if (typeInfo == PropertyTypeInfo.Vector4)
            {
                Vector4 vec4        = (Vector4)value;
                float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                float   curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                float   curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.x, curve1Value, data.Curve1, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.y, curve2Value, data.Curve2, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.z, curve3Value, data.Curve3, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.w, curve4Value, data.Curve4, state.ScrubberPosition, inArea);
            }
            else if (typeInfo == PropertyTypeInfo.Quaternion)
            {
                Quaternion quaternion  = (Quaternion)value;
                float      curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                float      curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                float      curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                float      curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(quaternion.x, curve1Value, data.Curve1, state.ScrubberPosition, inArea, QUATERNION_THRESHOLD);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(quaternion.y, curve2Value, data.Curve2, state.ScrubberPosition, inArea, QUATERNION_THRESHOLD);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(quaternion.z, curve3Value, data.Curve3, state.ScrubberPosition, inArea, QUATERNION_THRESHOLD);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(quaternion.w, curve4Value, data.Curve4, state.ScrubberPosition, inArea, QUATERNION_THRESHOLD);
            }
            else if (typeInfo == PropertyTypeInfo.Color)
            {
                Color color       = (Color)value;
                float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                hasDifferenceBeenFound |= addKeyOnUserInteraction(color.r, curve1Value, data.Curve1, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(color.g, curve2Value, data.Curve2, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(color.b, curve3Value, data.Curve3, state.ScrubberPosition, inArea);
                hasDifferenceBeenFound |= addKeyOnUserInteraction(color.a, curve4Value, data.Curve4, state.ScrubberPosition, inArea);
            }
        }
        if (hasDifferenceBeenFound)
        {
            hasUserInteracted = true;
            FillReverseKeyframes();
            EditorUtility.SetDirty(clipCurve);
        }
        else
        {
            m_RecordList.Clear();
        }
    }
Ejemplo n.º 11
0
    private void checkToAddNewKeyframes(CinemaActorClipCurve clipCurve, DirectorControlState state)
    {
        if (state.IsInPreviewMode && IsEditing && GUIUtility.hotControl == 0 &&
            (clipCurve.Firetime <= state.ScrubberPosition &&
             state.ScrubberPosition <= clipCurve.Firetime + clipCurve.Duration) && clipCurve.Actor != null)
        {
            Undo.RecordObject(clipCurve, "Auto Key Created");
            bool hasDifferenceBeenFound = false;
            foreach (MemberClipCurveData data in clipCurve.CurveData)
            {
                if (data.Type == string.Empty || data.PropertyName == string.Empty)
                {
                    continue;
                }

                Component component = clipCurve.Actor.GetComponent(data.Type);
                object    value     = clipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty);

                PropertyTypeInfo typeInfo = data.PropertyType;
                if (typeInfo == PropertyTypeInfo.Int || typeInfo == PropertyTypeInfo.Long || typeInfo == PropertyTypeInfo.Float ||
                    typeInfo == PropertyTypeInfo.Double)
                {
                    float x           = (float)value;
                    float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(x, curve1Value, data.Curve1, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Vector2)
                {
                    Vector2 vec2        = (Vector2)value;
                    float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.x, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.y, curve2Value, data.Curve2, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Vector3)
                {
                    Vector3 vec3        = (Vector3)value;
                    float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float   curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.x, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.y, curve2Value, data.Curve2, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.z, curve3Value, data.Curve3, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Vector4)
                {
                    Vector4 vec4        = (Vector4)value;
                    float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float   curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                    float   curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.x, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.y, curve2Value, data.Curve2, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.z, curve3Value, data.Curve3, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.w, curve4Value, data.Curve4, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Quaternion)
                {
                    Quaternion quaternion  = (Quaternion)value;
                    float      curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float      curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float      curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                    float      curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                    for (int j = 0; j < data.Curve1.length; j++)
                    {
                        Keyframe k = data.Curve1[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.x, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve1, j, newKeyframe);
                        }
                    }

                    for (int j = 0; j < data.Curve2.length; j++)
                    {
                        Keyframe k = data.Curve2[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.y, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve2, j, newKeyframe);
                        }
                    }

                    for (int j = 0; j < data.Curve3.length; j++)
                    {
                        Keyframe k = data.Curve3[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.z, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve3, j, newKeyframe);
                        }
                    }

                    for (int j = 0; j < data.Curve4.length; j++)
                    {
                        Keyframe k = data.Curve4[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.w, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve4, j, newKeyframe);
                        }
                    }

                    Quaternion curveValue = new Quaternion(curve1Value, curve2Value, curve3Value, curve4Value);
                    float      angle      = Vector3.Angle(quaternion.eulerAngles, curveValue.eulerAngles);
                    hasDifferenceBeenFound = hasDifferenceBeenFound || angle > QUATERNION_THRESHOLD;
                    if (angle > QUATERNION_THRESHOLD && hasUserInteracted)
                    {
                        data.Curve1.AddKey(state.ScrubberPosition, quaternion.x);
                        data.Curve2.AddKey(state.ScrubberPosition, quaternion.y);
                        data.Curve3.AddKey(state.ScrubberPosition, quaternion.z);
                        data.Curve4.AddKey(state.ScrubberPosition, quaternion.w);
                        hasUserInteracted = true;
                    }
                }
                else if (typeInfo == PropertyTypeInfo.Color)
                {
                    Color color       = (Color)value;
                    float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                    float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.r, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.g, curve2Value, data.Curve2, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.b, curve3Value, data.Curve3, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.a, curve4Value, data.Curve4, state.ScrubberPosition);
                }
            }
            if (hasDifferenceBeenFound)
            {
                hasUserInteracted = true;
                EditorUtility.SetDirty(clipCurve);
            }
        }
    }
    public override void OnInspectorGUI()
    {
        actorClipCurve.Update();
        CinemaActorClipCurve clipCurveGameObject = (target as CinemaActorClipCurve);

        if (clipCurveGameObject == null || clipCurveGameObject.Actor == null)
        {
            EditorGUILayout.HelpBox(ERROR_MSG, UnityEditor.MessageType.Error);
            return;
        }

        GameObject actor = clipCurveGameObject.Actor.gameObject;

        List <KeyValuePair <string, string> > currentCurves = new List <KeyValuePair <string, string> >();

        EditorGUILayout.PropertyField(editorRevert);
        EditorGUILayout.PropertyField(runtimeRevert);

        SerializedProperty curveData = actorClipCurve.FindProperty("curveData");

        if (curveData.arraySize > 0)
        {
            isDataFolded = EditorGUILayout.Foldout(isDataFolded, dataContent);
            if (isDataFolded)
            {
                for (int i = 0; i < curveData.arraySize; i++)
                {
                    SerializedProperty member         = curveData.GetArrayElementAtIndex(i);
                    SerializedProperty typeProperty   = member.FindPropertyRelative("Type");
                    SerializedProperty memberProperty = member.FindPropertyRelative("PropertyName");

                    KeyValuePair <string, string> curveStrings = new KeyValuePair <string, string>(typeProperty.stringValue, memberProperty.stringValue);
                    currentCurves.Add(curveStrings);

                    Component c = actor.GetComponent(typeProperty.stringValue);

                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField(new GUIContent(string.Format("{0}.{1}", typeProperty.stringValue, DirectorHelper.GetUserFriendlyName(typeProperty.stringValue, memberProperty.stringValue)), EditorGUIUtility.ObjectContent(c, c.GetType()).image));
                    if (GUILayout.Button("-", GUILayout.Width(24f)))
                    {
                        curveData.DeleteArrayElementAtIndex(i);
                    }
                    EditorGUILayout.EndHorizontal();
                }
            }
            GUILayout.Space(5);
        }

        isNewCurveFolded = EditorGUILayout.Foldout(isNewCurveFolded, addContent);

        if (isNewCurveFolded)
        {
            List <GUIContent> componentSelectionList = new List <GUIContent>();
            List <GUIContent> propertySelectionList  = new List <GUIContent>();

            Component[] components = DirectorHelper.getValidComponents(actor);
            for (int i = 0; i < components.Length; i++)
            {
                Component component = components[i];

                if (component != null)
                {
                    componentSelectionList.Add(new GUIContent(component.GetType().Name));
                }
            }

            componentSeletion = EditorGUILayout.Popup(new GUIContent("Component"), componentSeletion, componentSelectionList.ToArray());
            MemberInfo[]      members    = DirectorHelper.getValidMembers(components[componentSeletion]);
            List <MemberInfo> newMembers = new List <MemberInfo>();
            for (int i = 0; i < members.Length; i++)
            {
                MemberInfo memberInfo = members[i];
                if (!currentCurves.Contains(new KeyValuePair <string, string>(components[componentSeletion].GetType().Name, memberInfo.Name)))
                {
                    newMembers.Add(memberInfo);
                }
            }
            members = newMembers.ToArray();

            for (int i = 0; i < members.Length; i++)
            {
                MemberInfo memberInfo = members[i];
                string     name       = DirectorHelper.GetUserFriendlyName(components[componentSeletion], memberInfo);
                propertySelectionList.Add(new GUIContent(name));
            }
            propertySelection = EditorGUILayout.Popup(new GUIContent("Property"), propertySelection, propertySelectionList.ToArray());

            if (GUILayout.Button("Add Curve") && members.Length > 0)
            {
                Type         t          = null;
                PropertyInfo property   = members[propertySelection] as PropertyInfo;
                FieldInfo    field      = members[propertySelection] as FieldInfo;
                bool         isProperty = false;
                if (property != null)
                {
                    t          = property.PropertyType;
                    isProperty = true;
                }
                else if (field != null)
                {
                    t          = field.FieldType;
                    isProperty = false;
                }
                clipCurveGameObject.AddClipCurveData(components[componentSeletion], members[propertySelection].Name, isProperty, t);
            }
        }



        actorClipCurve.ApplyModifiedProperties();
    }
Ejemplo n.º 13
0
    public void OnSceneGUI()
    {
        CinemaActorClipCurve clipCurveGameObject = (target as CinemaActorClipCurve);

        for (int i = 0; i < clipCurveGameObject.CurveData.Count; i++)
        {
            MemberClipCurveData data = clipCurveGameObject.CurveData[i];
            if (data.Type == "Transform" && data.PropertyName == "localPosition")
            {
                HandlesUtility.DrawCurvePath(data.Curve1, data.Curve2, data.Curve3);

                /* for (int j = 0; j < data.Curve1.keys.Length - 1; j++)
                 * {
                 *   //AnimationUtility.SetKeyLeftTangentMode(data.Curve1, j, AnimationUtility.TangentMode.Linear);
                 *   Keyframe key1x = data.Curve1.keys[j];
                 *   Keyframe key1y = data.Curve2.keys[j];
                 *   Keyframe key1z = data.Curve3.keys[j];
                 *   Keyframe key2x = data.Curve1.keys[j + 1];
                 *   Keyframe key2y = data.Curve2.keys[j + 1];
                 *   Keyframe key2z = data.Curve3.keys[j + 1];
                 *
                 *   Vector3 position = new Vector3(key1x.value, key1y.value, key1z.value);
                 *   Vector3 inTangent1 = new Vector3(key1x.inTangent, key1y.inTangent, key1z.inTangent);
                 *   Vector3 outTangent1 = new Vector3(key1x.outTangent, key1y.outTangent, key1z.outTangent);
                 *
                 *   Vector3 position2 = new Vector3(key2x.value, key2y.value, key2z.value);
                 *   Vector3 inTangent2 = new Vector3(key2x.inTangent, key2y.inTangent, key2z.inTangent);
                 *   Vector3 outTangent2 = new Vector3(key2x.outTangent, key2y.outTangent, key2z.outTangent);
                 *
                 *   float handleSize = HandlesUtility.GetHandleSize(position);
                 *   Handles.Label(position + new Vector3(0.25f * handleSize, 0.0f * handleSize, 0.0f * handleSize), j.ToString());
                 *
                 *   Vector3 nPosition = HandlesUtility.PositionHandle(position, Quaternion.identity);
                 *   if (position != nPosition)
                 *   {
                 *       Keyframe nkey1 = new Keyframe(data.Curve1.keys[j].time, nPosition.x);
                 *       data.Curve1.MoveKey(j, nkey1);
                 *       Keyframe nkey2 = new Keyframe(data.Curve2.keys[j].time, nPosition.y);
                 *       data.Curve2.MoveKey(j, nkey2);
                 *       Keyframe nkey3 = new Keyframe(data.Curve3.keys[j].time, nPosition.z);
                 *       data.Curve3.MoveKey(j, nkey3);
                 *   }
                 *   if (j == data.Curve1.length - 2)
                 *   {
                 *       Vector3 nPosition2 = HandlesUtility.PositionHandle(position2, Quaternion.identity);
                 *       float handleSize2 = HandlesUtility.GetHandleSize(position2);
                 *       Handles.Label(position2 + new Vector3(0.25f * handleSize2, 0.0f * handleSize2, 0.0f * handleSize2), (j+1).ToString());
                 *
                 *       if (position2 != nPosition2)
                 *       {
                 *           Keyframe nkey1 = new Keyframe(data.Curve1.keys[j+1].time, nPosition2.x);
                 *           data.Curve1.MoveKey(j + 1, nkey1);
                 *           Keyframe nkey2 = new Keyframe(data.Curve2.keys[j + 1].time, nPosition2.y);
                 *           data.Curve2.MoveKey(j + 1, nkey2);
                 *           Keyframe nkey3 = new Keyframe(data.Curve3.keys[j + 1].time, nPosition2.z);
                 *           data.Curve3.MoveKey(j + 1, nkey3);
                 *       }
                 *   }
                 *
                 *   Vector3 ninTangent1 = HandlesUtility.TangentHandle(inTangent1 + position);
                 *   if (inTangent1 != ninTangent1)
                 *   {
                 *       Keyframe ok1= data.Curve1.keys[j];
                 *       Keyframe nkey1 = new Keyframe(ok1.time, ok1.value, ninTangent1.x - ok1.value, ok1.outTangent);
                 *       data.Curve1.MoveKey(j, nkey1);
                 *       Keyframe ok2 = data.Curve2.keys[j];
                 *       Keyframe nkey2 = new Keyframe(ok2.time, ok2.value, ninTangent1.y - ok2.value, ok2.outTangent);
                 *       data.Curve2.MoveKey(j, nkey2);
                 *       Keyframe ok3 = data.Curve3.keys[j];
                 *       Keyframe nkey3 = new Keyframe(ok3.time, ok3.value, ninTangent1.z - ok3.value, ok3.outTangent);
                 *       data.Curve3.MoveKey(j, nkey3);
                 *   }
                 *
                 *   float time1 = data.Curve1.keys[j].time;
                 *   float time2 = data.Curve1.keys[j +1].time;
                 *   int N = 20;
                 *   float gap = (time2 - time1) / N;
                 *
                 *   for (float t = time1; t < time2; t += gap)
                 *   {
                 *       Vector3 dposition = new Vector3(data.Curve1.Evaluate(t), data.Curve2.Evaluate(t), data.Curve3.Evaluate(t));
                 *       Vector3 dposition2 = new Vector3(data.Curve1.Evaluate(t + gap), data.Curve2.Evaluate(t + gap), data.Curve3.Evaluate(t + gap));
                 *       Handles.color = Color.red;
                 *       Handles.DrawLine(dposition, dposition2);
                 *       Handles.color = Color.white;
                 *   }
                 *
                 * }*/
            }
        }
    }
Ejemplo n.º 14
0
    private void showInScene(object userData)
    {
        CinemaActorClipCurve arg = userData as CinemaActorClipCurve;

        arg.showInScene = !arg.showInScene;
    }
Ejemplo n.º 15
0
    private void checkToAddNewKeyframes(CinemaActorClipCurve clipCurve, DirectorControlState state)
    {
        if (state.IsInPreviewMode && IsEditing &&
            clipCurve.Cutscene.State == Cutscene.CutsceneState.Paused && GUIUtility.hotControl == 0 &&
            (clipCurve.Firetime <= state.ScrubberPosition &&
             state.ScrubberPosition <= clipCurve.Firetime + clipCurve.Duration) && clipCurve.Actor != null)
        {
            Undo.RecordObject(clipCurve, "Auto Key Created");
            bool hasDifferenceBeenFound = false;
            for (int i = 0; i < clipCurve.CurveData.Count; i++)
            {
                MemberClipCurveData data = clipCurve.CurveData[i];
                if (data.Type == string.Empty || data.PropertyName == string.Empty)
                {
                    continue;
                }

                Component component = clipCurve.Actor.GetComponent(data.Type);
                object    value     = null;

                //Specific hard-coded fix for the Rotation Curve Issue.
                currentlyEditingRotation = data.PropertyName == "localEulerAngles";
#if UNITY_2017_2_OR_NEWER
                if (component != null)
                {
                    Type type = component.GetType();
                    if (data.IsProperty)
                    {
                        // Deal with a special case, use the new TransformUtils to get the rotation value from the editor field.
                        if (type == typeof(Transform) && data.PropertyName == "localEulerAngles")
                        {
                            value = UnityEditor.TransformUtils.GetInspectorRotation(component.transform); // TransformUtils added in 2017.2
                        }
                        else
                        {
                            value = clipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty);
                        }
                    }
                }
#else
                value = clipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty);
#endif

                PropertyTypeInfo typeInfo = data.PropertyType;

                if (typeInfo == PropertyTypeInfo.Int || typeInfo == PropertyTypeInfo.Long)
                {
                    float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(Convert.ToInt32(value), curve1Value, data.Curve1, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Float || typeInfo == PropertyTypeInfo.Double)
                {
                    float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(Convert.ToSingle(value), curve1Value, data.Curve1, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Vector2)
                {
                    Vector2 vec2        = (Vector2)value;
                    float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.x, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.y, curve2Value, data.Curve2, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Vector3)
                {
                    //Special check for rotations
                    if (!currentlyEditingRotation || (currentlyEditingRotation && clipCurve.Actor.transform.hasChanged))
                    {
                        Vector3 vec3        = (Vector3)value;
                        float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                        float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                        float   curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);

                        hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.x, curve1Value, data.Curve1, state.ScrubberPosition);
                        hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.y, curve2Value, data.Curve2, state.ScrubberPosition);
                        hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.z, curve3Value, data.Curve3, state.ScrubberPosition);
                    }
                }
                else if (typeInfo == PropertyTypeInfo.Vector4)
                {
                    Vector4 vec4        = (Vector4)value;
                    float   curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float   curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float   curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                    float   curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.x, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.y, curve2Value, data.Curve2, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.z, curve3Value, data.Curve3, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.w, curve4Value, data.Curve4, state.ScrubberPosition);
                }
                else if (typeInfo == PropertyTypeInfo.Quaternion)
                {
                    Quaternion quaternion  = (Quaternion)value;
                    float      curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float      curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float      curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                    float      curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                    for (int j = 0; j < data.Curve1.length; j++)
                    {
                        Keyframe k = data.Curve1[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.x, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve1, j, newKeyframe);
                        }
                    }

                    for (int j = 0; j < data.Curve2.length; j++)
                    {
                        Keyframe k = data.Curve2[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.y, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve2, j, newKeyframe);
                        }
                    }

                    for (int j = 0; j < data.Curve3.length; j++)
                    {
                        Keyframe k = data.Curve3[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.z, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve3, j, newKeyframe);
                        }
                    }

                    for (int j = 0; j < data.Curve4.length; j++)
                    {
                        Keyframe k = data.Curve4[j];
                        if (k.time == state.ScrubberPosition)
                        {
                            Keyframe newKeyframe = new Keyframe(k.time, quaternion.w, k.inTangent, k.outTangent);
                            newKeyframe.tangentMode = k.tangentMode;
                            AnimationCurveHelper.MoveKey(data.Curve4, j, newKeyframe);
                        }
                    }

                    Quaternion curveValue = new Quaternion(curve1Value, curve2Value, curve3Value, curve4Value);
                    float      angle      = Vector3.Angle(quaternion.eulerAngles, curveValue.eulerAngles);
                    hasDifferenceBeenFound = hasDifferenceBeenFound || angle > QUATERNION_THRESHOLD;
                    if (angle > QUATERNION_THRESHOLD && hasUserInteracted)
                    {
                        data.Curve1.AddKey(state.ScrubberPosition, quaternion.x);
                        data.Curve2.AddKey(state.ScrubberPosition, quaternion.y);
                        data.Curve3.AddKey(state.ScrubberPosition, quaternion.z);
                        data.Curve4.AddKey(state.ScrubberPosition, quaternion.w);
                        hasUserInteracted = true;
                    }
                }
                else if (typeInfo == PropertyTypeInfo.Color)
                {
                    Color color       = (Color)value;
                    float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);
                    float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition);

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.r, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.g, curve2Value, data.Curve2, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.b, curve3Value, data.Curve3, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(color.a, curve4Value, data.Curve4, state.ScrubberPosition);
                }
            }
            if (hasDifferenceBeenFound)
            {
                hasUserInteracted = true;
                EditorUtility.SetDirty(clipCurve);
            }
        }
    }