Example #1
0
 public void Add(IRigEffectorHolder holder, Transform transform)
 {
     m_Transforms.Add(new HolderTransformPair()
     {
         holder = holder, transform = transform
     });
 }
        static void FetchOrCreateEffectors(IRigEffectorHolder holder)
        {
            foreach (var effectorData in holder.effectors)
            {
                if (s_Effectors.ContainsKey(effectorData))
                {
                    s_ActiveEffectors.Add(s_Effectors[effectorData]);
                }
                else
                {
                    var newEffector = ScriptableObject.CreateInstance <RigEffector>();
                    newEffector.Initialize(effectorData);

                    s_Effectors.Add(effectorData, newEffector);
                    s_ActiveEffectors.Add(newEffector);
                }
            }
        }
        public void OnSceneGUIOverlay()
        {
            GameObject targetGameObject = null;

            m_SerializedObject.Update();

            if (!m_SerializedObject.isEditingMultipleObjects)
            {
                RigEffector rigEffector = m_SerializedObject.targetObject as RigEffector;
                if (rigEffector.transform != null)
                {
                    targetGameObject = rigEffector.transform.gameObject;
                }
            }

            GUILayout.BeginHorizontal(GUILayout.Width(210.0f));

            EditorGUI.BeginChangeCheck();
            m_ExpandOverlay = EditorGUILayout.Toggle(m_ExpandOverlay, EditorStyles.foldout, GUILayout.Width(12));
            if (EditorGUI.EndChangeCheck())
            {
                EditorPrefs.SetBool(s_ExpandOverlayPrefKey, m_ExpandOverlay);
            }

            GUILayout.BeginHorizontal(EditorStyles.toolbar);

            EditorGUILayout.PropertyField(m_Visible, GUIContent.none, GUILayout.Width(17));

            GUILayout.Label((targetGameObject != null) ? targetGameObject.name : "(Multiple objects)");

            if (GUILayout.Button(GUIContent.none, "OL Minus", GUILayout.Width(17)))
            {
                UnityEngine.Object[] targetObjects = m_SerializedObject.targetObjects;
                foreach (var targetObject in targetObjects)
                {
                    var       effector  = targetObject as IRigEffector;
                    Transform transform = effector.transform;

                    IRigEffectorHolder holder = FetchRigEffectorHolder(transform);
                    if (holder != null)
                    {
                        var holderObject = holder as UnityEngine.Object;

                        Undo.RecordObject(holderObject, "Remove Effector");

                        if (PrefabUtility.IsPartOfPrefabInstance(holderObject))
                        {
                            EditorUtility.SetDirty(holderObject);
                        }

                        holder.RemoveEffector(transform);
                    }
                }
            }

            GUILayout.EndHorizontal();
            GUILayout.EndHorizontal();

            if (m_ExpandOverlay)
            {
                EditorGUILayout.LabelField(s_ShapeLabel);
                EditorGUILayout.PropertyField(m_Shape, GUIContent.none);

                Rect rect = GUILayoutUtility.GetRect(s_ColorLabel, EditorStyles.colorField);

                // Shenanigans to bypass color picker bug.
                var evt = Event.current;
                if (evt.type == EventType.MouseUp)
                {
                    if (rect.Contains(evt.mousePosition))
                    {
                        GUIUtility.hotControl = 0;
                    }
                }

                EditorGUI.BeginProperty(rect, s_ColorLabel, m_Color);
                EditorGUI.BeginChangeCheck();
                Color newColor = EditorGUI.ColorField(rect, s_ColorLabel, m_Color.colorValue, false, true, false);
                if (EditorGUI.EndChangeCheck())
                {
                    m_Color.colorValue = newColor;
                }
                EditorGUI.EndProperty();

                EditorGUILayout.PropertyField(m_Size, s_SizeLabel);
                EditorGUILayout.PropertyField(m_Position, s_PositionLabel);
                EditorGUILayout.PropertyField(m_Rotation, s_RotationLabel);
            }

            if (m_SerializedObject.hasModifiedProperties)
            {
                UnityEngine.Object[] targetObjects = m_SerializedObject.targetObjects;
                foreach (var targetObject in targetObjects)
                {
                    var       effector  = targetObject as IRigEffector;
                    Transform transform = effector.transform;

                    IRigEffectorHolder holder = FetchRigEffectorHolder(transform);
                    if (holder != null)
                    {
                        var holderObject = holder as UnityEngine.Object;
                        Undo.RecordObject(holderObject, "Edit Effector");

                        if (PrefabUtility.IsPartOfPrefabInstance(holderObject))
                        {
                            EditorUtility.SetDirty(holderObject);
                        }
                    }
                }

                m_SerializedObject.ApplyModifiedProperties();
            }
        }
        static IRigEffectorOverlay FetchOrCreateEffectorOverlay()
        {
            Transform[] transforms         = Selection.GetTransforms(SelectionMode.ExcludePrefab | SelectionMode.Editable);
            var         inspectedEffectors = new List <ScriptableObject>();

            for (int i = 0; i < s_ActiveEffectors.Count; ++i)
            {
                var effector = s_ActiveEffectors[i];
                if (effector != null && effector.transform != null)
                {
                    if (Selection.Contains(effector.transform) || Selection.Contains(effector.transform.gameObject))
                    {
                        inspectedEffectors.Add(s_ActiveEffectors[i]);
                    }
                }
            }

            if (inspectedEffectors.Count > 0)
            {
                var overlay = new RigEffectorOverlay();
                overlay.Initialize(new SerializedObject(inspectedEffectors.ToArray()));

                s_ActiveOverlay = overlay;
            }
            else
            {
                RigEffectorWizard wizard = null;

                foreach (var transform in transforms)
                {
                    RigBuilder         rigBuilder = EditorHelper.GetClosestComponent <RigBuilder>(transform);
                    Rig                rig        = EditorHelper.GetClosestComponent <Rig>(transform, (rigBuilder != null) ? rigBuilder.transform : null);
                    IRigEffectorHolder holder     = (rig != null) ? (IRigEffectorHolder)rig : (IRigEffectorHolder)rigBuilder;

                    if (holder == null)
                    {
                        continue;
                    }

                    if (wizard == null)
                    {
                        wizard = new RigEffectorWizard();
                    }

                    wizard.Add(holder, transform);
                }

                if (wizard != null)
                {
                    s_ActiveOverlay = wizard;
                }
                else
                {
                    s_ActiveOverlay = null;
                }
            }

            s_ActiveSelection = transforms;

            return(s_ActiveOverlay);
        }