public override void LayoutComposedItem(Object item)
        {
            ITransform transformItem = item as ITransform;

            // centered
            transformItem.Local.Translation = Vector3.Zero;
            transformItem.Compose();
        }
Esempio n. 2
0
            public void SetFocus(int indexNew)
            {
                float twitchTime = 0.1f;

                // Undo previous slice selection state.
                if ((this.indexLastHoverItem > -1) &&
                    (this.indexLastHoverItem != indexNew))
                {
                    PieMenuSlice menuSlice = this.slices[indexLastHoverItem];
                    menuSlice.DiffuseColor = PieSelector.RenderObjSlice.ColorNormal;

                    if (slices.Count > 2) // dont move them if only two
                    {
                        ITransform transformSlice       = menuSlice.mySlice as ITransform;
                        TwitchManager.Set <Vector3> set = delegate(Vector3 value, Object param)
                        {
                            transformSlice.Local.OriginTranslation = value;
                            transformSlice.Compose();
                        };
                        TwitchManager.CreateTwitch <Vector3>(
                            transformSlice.Local.OriginTranslation,
                            SliceOffsetDefault,
                            set,
                            twitchTime,
                            TwitchCurve.Shape.EaseInOut);
                    }
                }

                // apply new slice selection state
                // if (indexNew != indexCenteredItem)
                if ((indexNew > -1) &&
                    (indexNew != indexCurrentHoverItem))
                {
                    PieMenuSlice menuSlice = this.slices[indexNew];
                    menuSlice.DiffuseColor = PieSelector.RenderObjSlice.ColorSelectedBright;

                    Foley.PlayClick();
                    if (slices.Count > 2) // don't move them if only two
                    {
                        ITransform transformSlice = menuSlice.mySlice as ITransform;
                        {
                            TwitchManager.Set <Vector3> set = delegate(Vector3 value, Object param)
                            {
                                transformSlice.Local.OriginTranslation = value;
                                transformSlice.Compose();
                            };
                            TwitchManager.CreateTwitch <Vector3>(
                                transformSlice.Local.OriginTranslation,
                                new Vector3(0.20f, 0.0f, 0.0f),
                                set,
                                twitchTime,
                                TwitchCurve.Shape.EaseInOut);
                        }
                    }
                    indexCurrentHoverItem = indexNew;
                }
            }
        public override void LayoutItems(ArrayList items)
        {
            float neededCircumference;

            // calc needed circumference
            //
            CalcLayoutInfoFromItems(out neededCircumference, out this.maxItemRadius, items, 1);

            // calc radius of the spiral
            //
            float radius = neededCircumference / MathHelper.TwoPi;
            float spacingCircumference = 0.0f; // spacing between items on the circumference
            float radiusSpiral         = this.maxItemRadius * 2.0f;

            {
                // radius is too small, must increase
                // this is assuming the center composed item is the same size as the other items
                radius = this.maxItemRadius * 2.0f;
                // and provide the extra spacing between items on the circumference
                float newCircumference = MathHelper.TwoPi * radius;
                spacingCircumference = (newCircumference - neededCircumference) / items.Count;
                neededCircumference  = newCircumference;
            }


            // layout items into position spiraling on the circumference
            //
            float headingArcLength = 0.0f;

            for (int indexItem = 0; indexItem < items.Count; indexItem++)
            {
                OrbitalSelector.ItemData itemData = items[indexItem] as OrbitalSelector.ItemData;
                IBounding  boundingItem           = itemData.item as IBounding;
                ITransform transformItem          = itemData.item as ITransform;

                // skip the first one so it is top dead center
                if (indexItem != 0)
                {
                    // update angle along arc
                    headingArcLength += boundingItem.BoundingSphere.Radius;
                }

                // create a vector to the current heading
                float   headingAngle = headingArcLength / radius;
                Vector3 heading      = new Vector3((float)(Math.Sin(headingAngle) * radiusSpiral), (float)(Math.Cos(headingAngle) * radiusSpiral), 0.0f);

                // set position
                transformItem.Local.Translation = heading;
                transformItem.Compose();

                // update angle along arc
                headingArcLength += boundingItem.BoundingSphere.Radius + spacingCircumference;
                // update the spiral radius
                radiusSpiral += boundingItem.BoundingSphere.Radius / 6.0f;
            }
            this.maxOrbit = radiusSpiral;
        }
Esempio n. 4
0
        bool ITransform.Compose()
        {
            ITransform transform = renderPanel as ITransform;
            bool       changed   = transform.Compose();

            if (changed)
            {
                RecalcMatrix();
            }
            return(changed);
        }
Esempio n. 5
0
        protected void AddCard(Matrix local,
                               ProgrammingElement element,
                               CardSpace.CardType cardType,
                               ControlRenderObj renderClause)
        {
            ReflexCard card = new ReflexCard(this, reflex, element, cardType, controls);

            card.renderClause = renderClause;
            ITransform transformCard = card as ITransform;
            Matrix     anchor        = card.Anchor(true); // invert the anchor to apply to its owner

            transformCard.Local.Matrix = local * anchor;  // *shiftOutOfSocket;
            transformCard.Compose();
            listControls.Add(card);
            card.Change += CardChanged;
        }
Esempio n. 6
0
            private void BuildSlices()
            {
                ProgrammingElement el = null;

                ///---------------------
                ///
                float       circumferenceAtItems = 5.0f + slices.Count / 6.0f;
                float       maxItemRadius        = 0.5f + slices.Count / 40.0f;
                const float radiusAtItemSpacing  = 0.2f;

                // calculate layout information from items
                // depreciated....
                //CalcLayoutInfoFromItems(out circumferenceAtItems, out maxItemRadius);

                // calc radius of the pie
                this.radiusAtItems = circumferenceAtItems / MathHelper.TwoPi + radiusAtItemSpacing;
                float spacingCircumference = 0.0f; // spacing between items on the circumference

                // adjust spacing if radius is smaller than the inner radius (one item)
                if (this.radiusAtItems < maxItemRadius * 2.0f)
                {
                    // radius is too small, must increase
                    this.radiusAtItems = maxItemRadius * 2.0f + radiusAtItemSpacing;
                    // and provide the extra spacing between items on the circumference
                    float newCircumference = MathHelper.TwoPi * this.radiusAtItems;
                    spacingCircumference = (newCircumference - circumferenceAtItems) / slices.Count;
                    circumferenceAtItems = newCircumference;
                }
                float radiusInside  = maxItemRadius * 1.2f;                        // with a little spacing
                float radiusOutside = this.radiusAtItems + (maxItemRadius * 1.2f); // with a little spacing
                float arcLength     = MathHelper.TwoPi / slices.Count;

                Vector2 posUV    = Vector2.Zero;
                Matrix  invWorld = Matrix.Invert(worldMatrix);


                Fugly fuglyTransform = new Fugly();

                for (int indexItem = 0; indexItem < slices.Count; indexItem++)
                {
                    ReflexCard reflex = slices[indexItem].MenuItem as ReflexCard;
                    if (reflex != null)
                    {
                        el = reflex.Reflex.Sensor;
                    }

                    float rot = MathHelper.PiOver2 - indexItem * arcLength;

                    //  slices[indexItem].mySlice = BuildPieSlice(el, arcLength, radiusInside, radiusOutside);
                    slices[indexItem].mySlice = BuildPieSlice(slices[indexItem].sliceType, arcLength, radiusInside, radiusOutside);
                    innerRadius = radiusInside;
                    outerRadius = radiusOutside;


                    // create a slice for every item

                    ITransform transformSlice = slices[indexItem].mySlice as ITransform;

                    // rotate the slice into place
                    transformSlice.Local.OriginTranslation = SliceOffsetDefault; // move away from center to space them
                    transformSlice.Local.RotationZ         = rot;
                    transformSlice.Compose();

                    // setting position for the icon....
                    Matrix  rotation    = Matrix.CreateRotationZ(rot);
                    Vector3 fixRotation = new Vector3(radiusInside + (radiusOutside - radiusInside) * 0.6f, 0.0f, 0.0f);

                    slices[indexItem].Position  = camera.WorldToScreenCoordsVector2(Vector3.Transform(fixRotation, rotation));
                    slices[indexItem].Position -= slices[indexItem].WhenBlockSize / 2;
                }
            }
Esempio n. 7
0
        bool ITransform.Compose()
        {
            ITransform transform = renderObj as ITransform;

            return(transform.Compose());
        }
Esempio n. 8
0
        public override void LayoutItems(ArrayList items)
        {
            float neededCircumference;

            // calc needed circumference
            //
            CalcLayoutInfoFromItems(out neededCircumference, out this.maxItemRadius, items, 1);

            // calc radius of the pie
            //
            float radius = neededCircumference / MathHelper.TwoPi;
            float spacingCircumference = 0.0f; // spacing between items on the circumference

            if (radius < this.maxItemRadius * 2.0f)
            {
                // radius is too small, must increase
                // this is assuming the center composed item is the same size as the other items
                radius = this.maxItemRadius * 2.0f;
                // and provide the extra spacing between items on the circumference
                float newCircumference = MathHelper.TwoPi * radius;
                spacingCircumference = (newCircumference - neededCircumference) / items.Count;
                neededCircumference  = newCircumference;
            }

            this.maxOrbit = radius;
            // layout items into position on the circumference
            //
            float headingArcLength = 0.0f;

            for (int indexItem = 0; indexItem < items.Count; indexItem++)
            {
                OrbitalSelector.ItemData itemData = items[indexItem] as OrbitalSelector.ItemData;
                IBounding  boundingItem           = itemData.item as IBounding;
                ITransform transformItem          = itemData.item as ITransform;

                // skip the first one so it is top dead center
                if (indexItem != 0)
                {
                    // update angle along arc
                    headingArcLength += boundingItem.BoundingSphere.Radius;
                }

                // create a vector to the current heading
                float   headingAngle = headingArcLength / radius;
                Vector3 heading      = new Vector3((float)(Math.Sin(headingAngle) * radius), (float)(Math.Cos(headingAngle) * radius), 0.0f);

                // set position by animations
                // transformItem.Local = Matrix.CreateTranslation(heading);
                TwitchManager.GetVector3 get = delegate(Object param)
                {
                    return(Vector3.Zero);
                };
                TwitchManager.SetVector3 set = delegate(Vector3 value, Object param)
                {
                    ITransform transformObject = param as ITransform;
                    if (transformObject != null)
                    {
                        transformObject.Local.Translation = value;
                        transformObject.Compose();
                    }
                };
                TwitchManager.Vector3Twitch twitch = new TwitchManager.Vector3Twitch(
                    get,
                    set,
                    heading,
                    0.2f,
                    TwitchCurve.Shape.EaseOut,
                    transformItem);
                twitch.Play();

                // update angle along arc
                headingArcLength += boundingItem.BoundingSphere.Radius + spacingCircumference;
            }
        }
Esempio n. 9
0
        public override void LayoutItems(ArrayList items)
        {
            float neededCircumference;
            int   rows;
            int   cols;

            // calc needed circumference
            //
            CalcLayoutInfoFromItems(out this.maxItemRadius, out rows, out cols, items);

            float itemWidth = this.maxItemRadius * 2.0f * (float)Math.Sin(Math.PI * 0.25) + 0.1f;

            this.maxOrbit            = this.maxItemRadius * (float)rows / 2.0f;
            this.maxInterItemSpacing = this.maxItemRadius * 2.0f;
            for (int indexItem = 0; indexItem < items.Count; indexItem++)
            {
                OrbitalSelector.ItemData itemData = items[indexItem] as OrbitalSelector.ItemData;
                IBounding  boundingItem           = itemData.item as IBounding;
                ITransform transformItem          = itemData.item as ITransform;

                int col = (indexItem % cols) - (cols / 2);
                int row = (indexItem / cols) - (rows / 2);

                Vector3 position = new Vector3((float)col * itemWidth, (float)row * -itemWidth, 0.0f);
                Debug.Print("[{0}][{1}] ({2,8:F},{3,8:F})", col, row, position.X, position.Y);
                this.maxOrbit = MathHelper.Max(this.maxOrbit, Math.Abs(position.X));

                // set position by animations
                // transformItem.Local = Matrix.CreateTranslation(heading);
                TwitchManager.GetVector3 get = delegate(Object param)
                {
                    return(Vector3.Zero);
                };
                TwitchManager.SetVector3 set = delegate(Vector3 value, Object param)
                {
                    ITransform transformObject = param as ITransform;
                    if (transformObject != null)
                    {
                        transformObject.Local.Translation = value;
                        transformObject.Compose();
                    }
                };
                TwitchManager.Vector3Twitch twitch = new TwitchManager.Vector3Twitch(
                    get,
                    set,
                    position,
                    0.2f,
                    TwitchCurve.Shape.EaseOut,
                    transformItem);
                twitch.Play();
            }

/*
 *          // layout items into position on a grid starting top left
 *          //
 *          int ring = 1;
 *          int cols = 3; // first ring is 3x3
 *          int colEnd = (cols / 2);
 *          int col = -(colEnd);
 *          int row = -(colEnd);
 *          int colInc = 1;
 *          int rowInc = 0;
 *
 *          float itemWidth = this.maxItemRadius * 2.0f;
 *
 *          for (int indexItem = 0; indexItem < items.Count; indexItem++)
 *          {
 *              OrbitalSelector.ItemData itemData = items[indexItem] as OrbitalSelector.ItemData;
 *              IBounding boundingItem = itemData.item as IBounding;
 *              ITransform transformItem = itemData.item as ITransform;
 *
 *
 *              Vector3 position = new Vector3((float)col * itemWidth, (float)row * -itemWidth, 0.0f);
 *              Debug.Print("[{0}][{1}] ({2,8:F},{3,8:F})", col, row, position.X, position.Y);
 *
 *              col += colInc;
 *              row += rowInc;
 *              // reached right
 *              if (col > colEnd)
 *              {
 *                  col = colEnd;
 *                  colInc = 0;
 *                  rowInc = 1;
 *                  row += rowInc;
 *              }
 *              // reached bottom
 *              if (row > colEnd)
 *              {
 *                  row = colEnd;
 *                  colInc = -1;
 *                  rowInc = 0;
 *                  col += colInc;
 *              }
 *              // reached left
 *              if (col < -colEnd)
 *              {
 *                  col = -colEnd;
 *                  colInc = 0;
 *                  rowInc = -1;
 *                  row += rowInc;
 *              }
 *              // reached top
 *              if (col == -colEnd && row == -colEnd)
 *              {
 *                  cols += 2;
 *                  colEnd = (cols / 2);
 *                  col = -(colEnd);
 *                  row = -(colEnd);
 *                  colInc = 1;
 *                  rowInc = 0;
 *              }
 *
 *              // set position by animations
 *              // transformItem.Local = Matrix.CreateTranslation(heading);
 *              TwitchManager.GetVector3 get = delegate(Object param)
 *                      {
 *                          return Vector3.Zero;
 *                      };
 *              TwitchManager.SetVector3 set = delegate(Vector3 value, Object param)
 *                      {
 *                          ITransform transformObject = param as ITransform;
 *                          if (transformObject != null)
 *                          {
 *                              transformObject.Local.Translation = value;
 *                              transformObject.Compose();
 *                          }
 *                      };
 *              TwitchManager.Vector3Twitch twitch = new TwitchManager.Vector3Twitch(
 *                      get,
 *                      set,
 *                      position,
 *                      0.2f,
 *                      TwitchCurve.Shape.EaseOut,
 *                      transformItem);
 *              twitch.Play();
 *          }
 *          this.maxOrbit = colEnd * itemWidth;
 */
        }
Esempio n. 10
0
        protected void CreateCards(string idState)
        {
            // create handle
            //
            ReflexHandle reflexHandle    = new ReflexHandle(this, reflex, controls);
            ITransform   transformHandle = reflexHandle as ITransform;
            Matrix       anchor;

            renderPanel.GetPositionTransform(idRowHandleAnchor, out anchor);
            transformHandle.Local.Matrix = anchor;
            transformHandle.Compose();
            listControls.Add(reflexHandle);

            Matrix chain;

            renderPanel.GetPositionTransform(idLeftClauseAnchor, out chain);
            Matrix clauseOffset = Matrix.Identity;
            {
                Matrix leftClause;
                Matrix rightClause;

                renderPanel.GetPositionTransform(idLeftClauseAnchor, out leftClause);
                renderPanel.GetPositionTransform(idRightClauseAnchor, out rightClause);
                clauseOffset.Translation = rightClause.Translation - leftClause.Translation;
            }

            Matrix local;

            // create the begining of the when clause trays
            //
            chain = AddClauseLeft(this.listWhenClause, chain, idWhenClause, idState);

            // create cards for when clause
            //
            //Matrix shiftOutOfSocket = Matrix.CreateTranslation(new Vector3(0.0f, 0.0f, 0.05f));
            CardSpace.CardType plusType    = CardSpace.CardType.Sensor;
            ProgrammingElement plusElement = CardSpace.Cards.NullSensor;

            if (reflex.Sensor != null)
            {
                chain = AddClauseRepeat(this.listWhenClause, out local, chain, idWhenClause, idState);
                AddCard(local,
                        reflex.Sensor,
                        CardSpace.CardType.Sensor,
                        this.listWhenClause[this.listWhenClause.Count - 1] as ControlRenderObj);
                plusType    = CardSpace.CardType.Filter;
                plusElement = CardSpace.Cards.NullFilter;
            }

            if (reflex.RawFilters != null)
            {
                for (int iFilter = 0; iFilter < reflex.RawFilters.Count; iFilter++)
                {
                    Filter filter = reflex.RawFilters[iFilter] as Filter;

                    chain = AddClauseRepeat(this.listWhenClause, out local, chain, idWhenClause, idState);
                    AddCard(local,
                            filter,
                            CardSpace.CardType.Filter,
                            this.listWhenClause[this.listWhenClause.Count - 1] as ControlRenderObj);
                }
            }

            // create the end of the when clause
            chain = AddClauseRight(this.listWhenClause, out local, chain, idWhenClause, idState);
            if (ReflexCard.HasSelectableElements(reflex, plusType))
            {
                // add the ever present + with context
                AddCard(local,
                        plusElement,
                        plusType,
                        this.listWhenClause[this.listWhenClause.Count - 1] as ControlRenderObj);
            }

            // adjust for next clause
            chain *= clauseOffset;

            // create the begining of the do clause trays
            //
            chain = AddClauseLeft(this.listDoClause, chain, idDoClause, idState);

            plusType    = CardSpace.CardType.Actuator;
            plusElement = CardSpace.Cards.NullActuator;
            if (reflex.Actuator != null)
            {
                chain = AddClauseRepeat(this.listDoClause, out local, chain, idDoClause, idState);
                AddCard(local,
                        reflex.Actuator,
                        CardSpace.CardType.Actuator,
                        this.listDoClause[this.listDoClause.Count - 1] as ControlRenderObj);
                // Specify Selector type here, since selector menu will pull in modifiers as well.
                plusType    = CardSpace.CardType.Selector;
                plusElement = CardSpace.Cards.NullSelector;
            }

            if (reflex.Selector != null && !reflex.Selector.hiddenDefault)
            {
                chain = AddClauseRepeat(this.listDoClause, out local, chain, idDoClause, idState);
                AddCard(local,
                        reflex.Selector,
                        CardSpace.CardType.Selector,
                        this.listDoClause[this.listDoClause.Count - 1] as ControlRenderObj);
                // Specify Selector type here, since selector menu will pull in modifiers as well.
                plusType    = CardSpace.CardType.Selector;
                plusElement = CardSpace.Cards.NullSelector;
            }

            if (reflex.Modifiers != null)
            {
                for (int iModifier = 0; iModifier < reflex.Modifiers.Count; iModifier++)
                {
                    Modifier modifier = reflex.Modifiers[iModifier] as Modifier;

                    chain = AddClauseRepeat(this.listDoClause, out local, chain, idDoClause, idState);
                    AddCard(local,
                            modifier,
                            CardSpace.CardType.Modifier,
                            this.listDoClause[this.listDoClause.Count - 1] as ControlRenderObj);
                }
            }

            // create the end of the do clause
            chain = AddClauseRight(this.listDoClause, out local, chain, idDoClause, idState);

            CardSpace.CardType cardTypeMask;
            if (reflex.Actuator == null)
            {
                cardTypeMask = CardSpace.CardType.Actuator;
            }
            else if (reflex.Selector == null && reflex.Modifiers.Count == 0)
            {
                cardTypeMask = CardSpace.CardType.Selector | CardSpace.CardType.Modifier;
            }
            else if (reflex.Selector == null && reflex.Modifiers.Count == 1 && this.ActiveCard > 0 && this.ActiveCard < this.listControls.Count && this.listControls[this.ActiveCard] is ReflexCard)
            {
                cardTypeMask = CardSpace.CardType.Modifier;
                if ((this.listControls[this.ActiveCard] as ReflexCard).Card is Modifier)
                {
                    cardTypeMask |= CardSpace.CardType.Selector;
                }
            }
            else
            {
                cardTypeMask = CardSpace.CardType.Modifier;
            }

            if (ReflexCard.HasSelectableElements(reflex, cardTypeMask))
            {
                // HACK HACK If use has DO Move Freeze this will still add a '+' to the
                // end because it thinks that a selector is still a possibility.  The
                // proper solution is to either make Freeze a selector or, better yet,
                // do away with selectors altogether.
                if (reflex.modifierUpids.Length == 0 || reflex.modifierUpids[0] != "modifier.constraint.immobile")
                {
                    // add the + with context
                    AddCard(local,
                            plusElement,
                            plusType,
                            this.listDoClause[this.listDoClause.Count - 1] as ControlRenderObj);
                }
            }

            for (int indexClause = 0; indexClause < this.listWhenClause.Count; indexClause++)
            {
                ControlRenderObj renderObj = this.listWhenClause[indexClause] as ControlRenderObj;
                renderObj.Activate();
                renderPanel.renderList.Add(renderObj);
            }

            for (int indexClause = 0; indexClause < this.listDoClause.Count; indexClause++)
            {
                ControlRenderObj renderObj = this.listDoClause[indexClause] as ControlRenderObj;
                renderObj.Activate();
                renderPanel.renderList.Add(renderObj);
            }

            for (int indexCard = 0; indexCard < this.listControls.Count; indexCard++)
            {
                GameObject gameObjCard = this.listControls[indexCard] as GameObject;
                gameObjCard.Activate();
                gameObjCard.Refresh(updateObjEditCards.updateList, renderPanel.renderList);
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Moves the curent panel to the correct indent position to match it's current indent level.
        /// If the panel is already in the correct position, nothing happens.  This is designed to
        /// work fine if called every frame for each panel.
        /// </summary>
        public void AnimatePanelIndent(bool force)
        {
            float kIndentSpacing = 0.6f;

            float x = reflex.Indentation * kIndentSpacing;

            if (position.X != x || force)
            {
                position.X = x;
                ITransform transform = this as ITransform;
                if (transform != null)
                {
                    TwitchManager.Set <float> set = delegate(float value, Object param) { Vector3 trans = transform.Local.Translation; trans.X = value; transform.Local.Translation = trans;  transform.Compose(); };
                    TwitchManager.CreateTwitch <float>(transform.Local.Translation.X, position.X, set, 0.1f, TwitchCurve.Shape.EaseOut, this, null);
                }
            }
        }
Esempio n. 12
0
        public void AnimatePanelShift(float changeZ, TwitchCompleteEvent callback)
        {
            position.Z += changeZ;
            ITransform transform = this as ITransform;

            if (transform != null)
            {
                TwitchManager.Set <float> set = delegate(float value, Object param) { Vector3 trans = transform.Local.Translation; trans.Z = value; transform.Local.Translation = trans; transform.Compose(); };
                TwitchManager.CreateTwitch <float>(transform.Local.Translation.Z, position.Z, set, twitchTime, TwitchCurve.Shape.EaseOut, this, callback);
            }
        }
Esempio n. 13
0
        public void AnimatePanelMove(float changeY)
        {
            position.Y += changeY;
            ITransform transform = this as ITransform;

            if (transform != null)
            {
                TwitchManager.Set <float> set = delegate(float value, Object param) { Vector3 trans = transform.Local.Translation; trans.Y = value; transform.Local.Translation = trans; transform.Compose(); };
                TwitchManager.CreateTwitch <float>(transform.Local.Translation.Y, position.Y, set, twitchTime, TwitchCurve.Shape.EaseOut);
            }
        }
            public void AddUISelector(List <GameObject> childList, out UiSelector uiSelector, bool ignorePaths)
            {
                //
                // Set up the pie menu for choosing new objects to add to the scene.
                //
                uiSelector = new PieSelector(null, "Sim.EditObjects.PickThing");

                // Size used for all items.
                Vector2 size = new Vector2(1.0f, 1.0f);

                // Boku
                var boku = ActorManager.GetActor("BokuBot");

                uiSelector.AddItem(new ActorMenuItem(uiSelector, boku.LocalizedName, boku.MenuTextureFile, boku, size, radialOffset));

                // Rover
                var rover = ActorManager.GetActor("Rover");

                uiSelector.AddItem(new ActorMenuItem(uiSelector, rover.LocalizedName, rover.MenuTextureFile, rover, size, radialOffset));

                // Fruit
                var fruit = ActorManager.GetActor("Fruit");

                uiSelector.AddItem(new ActorMenuItem(uiSelector, fruit.LocalizedName, fruit.MenuTextureFile, fruit, size, radialOffset));

                #region BotGroup1
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"Textures\Tiles\group.botsI", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickToken");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    // bot group items

                    var actors = ActorManager.GetActorsInGroup("BotGroup1");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }
                #endregion

                #region BotGroup2
                // some might think a subroutine would be a better way to structure this...
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"Textures\Tiles\group.botsII", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickToken");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    // bot group items
                    var actors = ActorManager.GetActorsInGroup("BotGroup2");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }
                #endregion

                #region objects group (star, coin, heart)
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"Textures\Tiles\group.objects", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickToken");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);


                    var actors = ActorManager.GetActorsInGroup("ObjectGroup");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }

                #endregion

                #region trees group
                // trees group
                //
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"filter.tree", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickTree");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    // Trees group items
                    var actors = ActorManager.GetActorsInGroup("TreeGroup");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }
                #endregion

                #region pipe group
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"filter.pipe", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickPipe");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    // Trees group items
                    var actors = ActorManager.GetActorsInGroup("PipeGroup");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }
                #endregion

                #region underwater group
                // underwater group
                //
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"filter.underwater", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickUnderwater");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    // Trees group items
                    var actors = ActorManager.GetActorsInGroup("UnderwaterGroup");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }
                #endregion

                #region rock group
                // rock group
                //
                {
                    var          rock  = ActorManager.GetActor("Rock");
                    RenderObject group = new ActorMenuItem(uiSelector, rock.LocalizedName, @"filter.rock", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickRock");

                    // move it out front
                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    // Trees group items
                    var actors = ActorManager.GetActorsInGroup("RockGroup");
                    for (int i = 0; i < actors.Count; i++)
                    {
                        selectorGroup.AddItem(new ActorMenuItem(selectorGroup, actors[i].LocalizedName, actors[i].MenuTextureFile, actors[i], size, groupRadialOffset));
                    }
                }
                #endregion

                // WayPoint
                #region waypoint group
                if (!ignorePaths)
                {
                    RenderObject group = new ActorMenuItem(uiSelector, null, @"Textures\Tiles\modifier.waypointwhite", null, size, radialOffset);

                    UiSelector selectorGroup = new PieSelector(group, "Sim.EditObjects.PickToken");

                    ITransform transformSelector = selectorGroup as ITransform;
                    transformSelector.Local.Translation = new Vector3(0.0f, 0.0f, sizeMenuItem);
                    transformSelector.Compose();

                    selectorGroup.ComposeDefault += NewItemSelectorComposeDefault;
                    selectorGroup.Select         += SelectNewItemSelector;
                    selectorGroup.Cancel         += CancelNewItemSelector;

                    uiSelector.AddGroup(group, selectorGroup);

                    selectorGroup.AddItem(new ActorMenuItem(selectorGroup, Strings.Localize("actorNames.pathGeneric"), @"filter.pathplain", null, size, radialOffset));
                    selectorGroup.AddItem(new ActorMenuItem(selectorGroup, Strings.Localize("actorNames.pathRoad"), @"filter.pathroad", null, size, radialOffset));
                    selectorGroup.AddItem(new ActorMenuItem(selectorGroup, Strings.Localize("actorNames.pathWall"), @"filter.pathwall", null, size, radialOffset));
                    selectorGroup.AddItem(new ActorMenuItem(selectorGroup, Strings.Localize("actorNames.pathVeggie"), @"filter.pathflora", null, size, radialOffset));

                    //uiSelector.AddItem(new ActorMenuItem(uiSelector, Strings.Localize("actorNames.wayPoint"), null, @"modifier.waypointwhite", null, size, radialOffset));

                    // move the selector into position
                    {
                        //ITransform transformSelector = uiSelector as ITransform;
                        //transformSelector.Local.RotationY = MathHelper.ToRadians(14.0f);
                        //transformSelector.Local.RotationX = MathHelper.ToRadians(14.0f);
                        //transformSelector.Compose();
                    }
                    // Add the selector to the child list.
                }
                #endregion waypoint group

                uiSelector.ComposeDefault += NewItemSelectorComposeDefault;
                uiSelector.Select         += SelectNewItemSelector;
                uiSelector.Cancel         += CancelNewItemSelector;
                childList.Add(uiSelector);
            }   // end of AddUISelector()