/// <summary>
    /// [HACK TRICK]
    /// update every loop,
    /// current in-edit clip, clip's rootTr
    /// </summary>
    private void _UpdateInternalInfo()
    {
        AnimationClip curClip = null;
        Transform     rootTr  = null;

        m_AnimationWindowState = EUtil.GetUnityAnimationWindowState(m_UAW);
        if (m_AnimationWindowState != null)
        {
            curClip = RCall.GetField("UnityEditorInternal.AnimationWindowState",
                                     "m_ActiveAnimationClip", m_AnimationWindowState) as AnimationClip;

#if U5
            GameObject rootGO = RCall.GetProp("UnityEditorInternal.AnimationWindowState",
                                              "activeRootGameObject", m_AnimationWindowState) as GameObject;
#else
            GameObject rootGO = RCall.GetField("UnityEditorInternal.AnimationWindowState",
                                               "m_RootGameObject", m_AnimationWindowState) as GameObject;
#endif
            if (rootGO != null)
            {
                rootTr = rootGO.transform;
            }
        }
        else
        {
            curClip = null;
            rootTr  = null;
        }

        if (curClip != m_CurClip)
        {
            _OnCurrentClipChange(m_CurClip, curClip);
        }
        if (rootTr != m_ClipRoot)
        {
            _OnRootTransformChange(m_ClipRoot, rootTr);
        }
    }
Beispiel #2
0
        void OnGUI()
        {
            EditorGUILayout.LabelField("Set the Roots:");
            for (int i = 0; i < m_Roots.Count; ++i)
            {
                EditorGUILayout.BeginHorizontal();
                {
                    EditorGUI.BeginChangeCheck();
                    var root = (Transform)EditorGUILayout.ObjectField(m_Roots[i], typeof(Transform), true);
                    if (EditorGUI.EndChangeCheck())
                    {
                        m_Roots[i] = root;
                    }
                    if (EUtil.Button("-", "delete entry", Color.red, GUILayout.Width(20f)))
                    {
                        m_Roots.RemoveAt(i);
                        GUIUtility.ExitGUI();
                    }
                }
                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginHorizontal();
            {
                GUILayout.Space(40f);
                if (GUILayout.Button("Add Root Entry"))
                {
                    m_Roots.Add(null);
                }
                GUILayout.Space(40f);
            }
            EditorGUILayout.EndHorizontal();

            GUILayout.Space(5f);

            if (GUILayout.Button(m_baking ? "Baking" : "Not Baking", EditorStyles.toolbarButton))
            {
                m_baking = !m_baking;

                if (m_baking)
                {
                    m_Trs.Clear();
                    foreach (var oneRoot in m_Roots)
                    {
                        for (var ie = oneRoot.GetRecurEnumerator(); ie.MoveNext();)
                        {
                            m_Trs.Add(ie.Current);
                        }
                    }

                    m_TrsArr = m_Trs.ToArray();
                    m_uaw    = EUtil.GetUnityAnimationWindow();
                    if (null == m_uaw)
                    {
                        m_baking = false;
                    }
                }
            }

            if (!m_baking)
            {
                EditorWindow uaw = (EditorWindow)EUtil.GetUnityAnimationWindow();
                if (uaw == null)
                {
                    EditorGUIUtility.ExitGUI();
                }
                object uawstate = EUtil.GetUnityAnimationWindowState(uaw);
                if (uawstate == null)
                {
                    EditorGUIUtility.ExitGUI();
                }
                var clip = RCall.GetField("UnityEditorInternal.AnimationWindowState",
                                          "m_ActiveAnimationClip", uawstate) as AnimationClip;
                if (clip == null)
                {
                    EditorGUIUtility.ExitGUI();
                }

                GUILayout.Space(5f);

                if (GUILayout.Button(new GUIContent("Compress Angles", "Only use this method on a clips full of keyframes"), EditorStyles.toolbarButton))
                {
                    _NormalizeRotationsInClip(uawstate, clip);
                }
            }
        }