Example #1
0
        public static ElementBounds CreateBounds(ElementBoundsSource boundsSource, ElementBoundsProvider boundsProvider, Transform transform, Func <Bounds> automaticAxisAlignedBox, Func <Sphere> automaticSphere)
        {
            var fixedScale    = (boundsSource & ElementBoundsSource.FixedScale) != 0;
            var fixedRotation = (boundsSource & ElementBoundsSource.FixedRotation) != 0;

            switch (boundsSource & ElementBoundsSource.Source)
            {
            case ElementBoundsSource.None:
                return(null);

            case ElementBoundsSource.LocalOrigin:
                return(new LocalOriginBounds());

            case ElementBoundsSource.Automatic:
                if (fixedRotation)
                {
                    goto case ElementBoundsSource.AutomaticAxisAlignedBox;
                }
                goto case ElementBoundsSource.AutomaticSphere;

            case ElementBoundsSource.AutomaticAxisAlignedBox:
                return(AxisAlignedBoxBounds.Create(automaticAxisAlignedBox(), transform, fixedScale));

            case ElementBoundsSource.AutomaticSphere:
                return(SphereBounds.Create(automaticSphere(), transform, fixedScale, fixedRotation));

            case ElementBoundsSource.Manual:
                return((boundsProvider != null) ? boundsProvider.CreateBounds(fixedScale, fixedRotation) : null);

            default:
                throw new NotImplementedException();
            }
        }
Example #2
0
        public static bool OnInspectorGUI(BoundedElement element, ref ElementBoundsSource source, ref ElementBoundsProvider provider)
        {
            EditorGUI.BeginChangeCheck();

            int sourceIndex;

            switch (source & ElementBoundsSource.Source)
            {
            case ElementBoundsSource.None: sourceIndex = 0; break;

            case ElementBoundsSource.LocalOrigin: sourceIndex = 1; break;

            case ElementBoundsSource.Automatic: sourceIndex = 2; break;

            case ElementBoundsSource.AutomaticAxisAlignedBox: sourceIndex = 3; break;

            case ElementBoundsSource.AutomaticSphere: sourceIndex = 4; break;

            case ElementBoundsSource.Manual: sourceIndex = 5; break;

            default: throw new NotImplementedException();
            }

            sourceIndex = EditorGUILayout.Popup(new GUIContent("Bounds", "The method by which a bounding volume is obtained for this wrap-around element, which will affect when the appropriate warp-around behavior is applied."), sourceIndex, _sourceLabels);

            bool fixedScale    = (source & ElementBoundsSource.FixedScale) != 0;
            bool fixedRotation = (source & ElementBoundsSource.FixedRotation) != 0;

            switch (sourceIndex)
            {
            case 0: source = ElementBoundsSource.None; break;

            case 1: source = ElementBoundsSource.LocalOrigin; break;

            case 2: source = ElementBoundsSource.Automatic; break;

            case 3: source = ElementBoundsSource.AutomaticAxisAlignedBox; break;

            case 4: source = ElementBoundsSource.AutomaticSphere; break;

            case 5: source = ElementBoundsSource.Manual; break;

            default: throw new NotImplementedException();
            }

            fixedScale = EditorGUILayout.Toggle(new GUIContent("Fixed Scale", "This element's transform scale is never expected to change anywhere in its ancestry."), fixedScale);

            if ((source & ElementBoundsSource.Source) != ElementBoundsSource.AutomaticAxisAlignedBox)
            {
                fixedRotation = EditorGUILayout.Toggle(new GUIContent("Fixed Rotation", "This element's transform rotation is never expected to change anywhere in its ancestry."), fixedRotation);
            }
            else
            {
                var priorEnabledState = GUI.enabled;
                GUI.enabled = false;
                EditorGUILayout.Toggle(new GUIContent("Fixed Rotation", "This element's transform rotation is never expected to change anywhere in its ancestry."), true);
                GUI.enabled = priorEnabledState;
            }

            if (fixedScale)
            {
                source |= ElementBoundsSource.FixedScale;
            }
            if (fixedRotation)
            {
                source |= ElementBoundsSource.FixedRotation;
            }

            if ((source & ElementBoundsSource.Source) == ElementBoundsSource.Manual)
            {
                if (provider == null)
                {
                    var providers = element.GetComponents <ElementBoundsProvider>();
                    if (providers != null && providers.Length == 1)
                    {
                        provider = providers[0];
                    }
                }

                provider = (ElementBoundsProvider)EditorGUILayout.ObjectField(new GUIContent("Bounds Provider", "The manually specified source for setting this wrap-around element's bounding volume."), provider, typeof(ElementBoundsProvider), true);
            }
            else
            {
                provider = null;
            }

            var changed = EditorGUI.EndChangeCheck();

            return(GUILayout.Button(new GUIContent("Refresh Bounds", "Recalculate this element's bounding volume based on the above settings and the configuration of all relevant game objects and components that may have changed.")) || changed);
        }