void IRigidBodyEditorToolEnvironment.SelectShapes(IEnumerable <ShapeInfo> shapes, SelectMode mode)
 {
     // If we're specifying null or no shapes explicitly, deselect all shapes
     if (mode == SelectMode.Set && (shapes == null || !shapes.Any()))
     {
         DualityEditorApp.Deselect(this, ObjectSelection.Category.Other);
     }
     // Otherwise, forward to regular object selection
     else
     {
         this.SelectObjects(shapes.Select(s => RigidBodyEditorSelShape.Create(s)).NotNull(), mode);
     }
 }
        public override List <ObjectEditorSelObj> PickSelObjIn(int x, int y, int w, int h)
        {
            List <ObjectEditorSelObj> result = new List <ObjectEditorSelObj>();

            RigidBody pickedCollider = null;
            ShapeInfo pickedShape    = null;

            RigidBody[] visibleColliders = this.QueryVisibleColliders()
                                           .Where(r => !DesignTimeObjectData.Get(r.GameObj).IsLocked)
                                           .ToArray();
            visibleColliders.StableSort(delegate(RigidBody c1, RigidBody c2)
            {
                return(MathF.RoundToInt(1000.0f * (c1.GameObj.Transform.Pos.Z - c2.GameObj.Transform.Pos.Z)));
            });

            // Pick a collider
            foreach (RigidBody c in visibleColliders)
            {
                Vector3 worldCoord = this.GetSpaceCoord(new Vector3(x, y, c.GameObj.Transform.Pos.Z));
                float   scale      = this.GetScaleAtZ(c.GameObj.Transform.Pos.Z);
                pickedShape = this.PickShapes(c, worldCoord.Xy, new Vector2(w / scale, h / scale)).FirstOrDefault();
                if (pickedShape != null)
                {
                    pickedCollider = c;
                    result.Add(new RigidBodyEditorSelBody(pickedCollider));
                    break;
                }
                else
                {
                    pickedShape = null;
                }
            }

            // Pick shapes
            if (pickedCollider != null)
            {
                Vector3          worldCoord = this.GetSpaceCoord(new Vector3(x, y, pickedCollider.GameObj.Transform.Pos.Z));
                float            scale      = this.GetScaleAtZ(pickedCollider.GameObj.Transform.Pos.Z);
                List <ShapeInfo> picked     = this.PickShapes(pickedCollider, worldCoord.Xy, new Vector2(w / scale, h / scale));
                if (picked.Count > 0)
                {
                    result.AddRange(picked.Select(s => RigidBodyEditorSelShape.Create(s) as ObjectEditorSelObj));
                }
            }

            return(result);
        }
        private void EditorForm_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.SameObjects)
            {
                return;
            }
            if (!e.AffectedCategories.HasFlag(ObjectSelection.Category.GameObjCmp) &&
                !e.AffectedCategories.HasFlag(ObjectSelection.Category.Other))
            {
                return;
            }

            // Collider selection changed
            if ((e.AffectedCategories & ObjectSelection.Category.GameObjCmp) != ObjectSelection.Category.None)
            {
                RigidBody newBody = this.QuerySelectedCollider();
                if (newBody != this.selectedBody)
                {
                    this.EndToolAction();
                }

                DualityEditorApp.Deselect(this, ObjectSelection.Category.Other);
                this.selectedBody = newBody;
            }
            // Other selection changed
            if ((e.AffectedCategories & ObjectSelection.Category.Other) != ObjectSelection.Category.None)
            {
                if (e.Current.OfType <ShapeInfo>().Any())
                {
                    this.allObjSel = e.Current.OfType <ShapeInfo>().Select(s => RigidBodyEditorSelShape.Create(s) as ObjectEditorSelObj).ToList();
                }
                else
                {
                    this.allObjSel = new List <ObjectEditorSelObj>();
                }

                // Update indirect object selection
                this.indirectObjSel.Clear();
                // Update (parent-free) action object selection
                this.actionObjSel = this.allObjSel.ToList();
            }

            this.InvalidateSelectionStats();
            this.UpdateRigidBodyToolButtons();
            this.Invalidate();
        }
        public override List <ObjectEditorSelObj> CloneObjects(IEnumerable <ObjectEditorSelObj> objEnum)
        {
            if (objEnum == null || !objEnum.Any())
            {
                return(base.CloneObjects(objEnum));
            }
            List <ObjectEditorSelObj> result = new List <ObjectEditorSelObj>();

            if (objEnum.OfType <RigidBodyEditorSelShape>().Any())
            {
                ShapeInfo[] selShapes = objEnum.OfType <RigidBodyEditorSelShape>().Select(s => (s.ActualObject as ShapeInfo).DeepClone()).ToArray();
                CreateRigidBodyShapeAction cloneAction = new CreateRigidBodyShapeAction(this.selectedBody, selShapes);
                UndoRedoManager.Do(cloneAction);
                result.AddRange(cloneAction.Result.Select(s => RigidBodyEditorSelShape.Create(s)));
            }
            return(result);
        }
        public override ObjectEditorSelObj PickSelObjAt(int x, int y)
        {
            RigidBody pickedCollider = null;
            ShapeInfo pickedShape    = null;

            RigidBody[] visibleColliders = this.QueryVisibleColliders()
                                           .Where(r => !DesignTimeObjectData.Get(r.GameObj).IsLocked)
                                           .ToArray();
            visibleColliders.StableSort(delegate(RigidBody c1, RigidBody c2)
            {
                return(MathF.RoundToInt(1000.0f * (c1.GameObj.Transform.Pos.Z - c2.GameObj.Transform.Pos.Z)));
            });

            foreach (RigidBody c in visibleColliders)
            {
                Vector3 worldCoord = this.GetSpaceCoord(new Vector3(x, y, c.GameObj.Transform.Pos.Z));

                // Do a physical picking operation
                pickedShape = this.PickShape(c, worldCoord.Xy);

                // Shape picked.
                if (pickedShape != null)
                {
                    pickedCollider = c;
                    break;
                }
            }

            if (pickedShape != null)
            {
                return(RigidBodyEditorSelShape.Create(pickedShape));
            }
            if (pickedCollider != null)
            {
                return(new RigidBodyEditorSelBody(pickedCollider));
            }

            return(null);
        }