public override List <CamViewState.SelObj> CloneObjects(IEnumerable <CamViewState.SelObj> objEnum)
        {
            List <SelObj> result = new List <SelObj>();

            if (objEnum.OfType <SelShape>().Any())
            {
                ShapeInfo[] selShapes = objEnum.OfType <SelShape>().Select(s => (s.ActualObject as ShapeInfo).Clone()).ToArray();
                CreateRigidBodyShapeAction cloneAction = new CreateRigidBodyShapeAction(this.selectedBody, selShapes);
                UndoRedoManager.Do(cloneAction);
                result.AddRange(cloneAction.Result.Select(s => SelShape.Create(s)));
            }
            return(result);
        }
Beispiel #2
0
        public override List <CamViewState.SelObj> PickSelObjIn(int x, int y, int w, int h)
        {
            List <CamViewState.SelObj> result = new List <SelObj>();

            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 SelBody(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 => SelShape.Create(s) as SelObj));
                }
            }

            return(result);
        }
Beispiel #3
0
        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.LeaveCursorState();
                }

                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 => SelShape.Create(s) as SelObj).ToList();
                }
                else
                {
                    this.allObjSel = new List <SelObj>();
                }

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

            this.InvalidateSelectionStats();
            this.UpdateToolbar();
            this.Invalidate();
        }
Beispiel #4
0
        public override CamViewState.SelObj 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(SelShape.Create(pickedShape));
            }
            if (pickedCollider != null)
            {
                return(new SelBody(pickedCollider));
            }

            return(null);
        }
Beispiel #5
0
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            GameObject selGameObj   = this.selectedBody != null ? this.selectedBody.GameObj : null;
            Transform  selTransform = selGameObj != null ? selGameObj.Transform : null;

            if (selTransform == null)
            {
                return;
            }

            Vector3 spaceCoord = this.GetSpaceCoord(new Vector3(e.X, e.Y, selTransform.Pos.Z));
            Vector2 localPos   = selTransform.GetLocalPoint(spaceCoord).Xy;

            if (this.mouseState == CursorState.CreateCircle)
            {
                #region CreateCircle
                if (e.Button == MouseButtons.Left)
                {
                    CircleShapeInfo newShape = new CircleShapeInfo(1.0f, localPos, 1.0f);

                    UndoRedoManager.BeginMacro();
                    UndoRedoManager.Do(new CreateRigidBodyShapeAction(this.selectedBody, newShape));

                    this.createAction = true;
                    this.LeaveCursorState();
                    this.SelectObjects(new[] { SelShape.Create(newShape) });
                    this.BeginAction(ObjectAction.Scale);
                }
                else if (e.Button == MouseButtons.Right)
                {
                    this.LeaveCursorState();
                }
                #endregion
            }
            else if (this.mouseState == CursorState.CreatePolygon)
            {
                #region CreatePolygon
                if (e.Button == MouseButtons.Left)
                {
                    bool success = false;
                    if (!this.allObjSel.Any(sel => sel is SelPolyShape))
                    {
                        PolyShapeInfo newShape = new PolyShapeInfo(new Vector2[] { localPos, localPos, localPos }, 1.0f);
                        UndoRedoManager.Do(new CreateRigidBodyShapeAction(this.selectedBody, newShape));
                        this.SelectObjects(new[] { SelShape.Create(newShape) });
                        this.createPolyIndex++;
                    }
                    else
                    {
                        SelPolyShape  selPolyShape = this.allObjSel.OfType <SelPolyShape>().First();
                        PolyShapeInfo polyShape    = selPolyShape.ActualObject as PolyShapeInfo;
                        if (this.createPolyIndex <= 2 || MathF.IsPolygonConvex(polyShape.Vertices))
                        {
                            Vector2 lockedPos = this.createPolyIndex > 0 ? polyShape.Vertices[this.createPolyIndex - 1] : Vector2.Zero;
                            MathF.TransformCoord(ref lockedPos.X, ref lockedPos.Y, selTransform.Angle);
                            MathF.TransformCoord(ref localPos.X, ref localPos.Y, selTransform.Angle);
                            localPos = this.ApplyAxisLock(localPos, lockedPos);
                            MathF.TransformCoord(ref localPos.X, ref localPos.Y, -selTransform.Angle);

                            if (polyShape.Vertices.Length < PolyShapeInfo.MaxVertices)
                            {
                                List <Vector2> vertices = polyShape.Vertices.ToList();

                                vertices[this.createPolyIndex] = localPos;
                                if (this.createPolyIndex >= vertices.Count - 1)
                                {
                                    vertices.Add(localPos);
                                }

                                polyShape.Vertices = vertices.ToArray();
                                selPolyShape.UpdatePolyStats();
                                this.createPolyIndex++;
                            }
                            else
                            {
                                Vector2[] vertices = polyShape.Vertices;

                                vertices[this.createPolyIndex] = localPos;
                                polyShape.Vertices             = vertices;
                                selPolyShape.UpdatePolyStats();

                                this.LeaveCursorState();
                            }
                        }
                    }

                    if (success)
                    {
                        DualityEditorApp.NotifyObjPropChanged(this,
                                                              new ObjectSelection(this.selectedBody),
                                                              ReflectionInfo.Property_RigidBody_Shapes);
                    }
                }
                else if (e.Button == MouseButtons.Right)
                {
                    if (this.allObjSel.Any(sel => sel is SelPolyShape))
                    {
                        SelPolyShape   selPolyShape = this.allObjSel.OfType <SelPolyShape>().First();
                        PolyShapeInfo  polyShape    = selPolyShape.ActualObject as PolyShapeInfo;
                        List <Vector2> vertices     = polyShape.Vertices.ToList();

                        vertices.RemoveAt(this.createPolyIndex);
                        if (vertices.Count < 3 || this.createPolyIndex < 2)
                        {
                            this.DeleteObjects(new SelPolyShape[] { selPolyShape });
                        }
                        else
                        {
                            polyShape.Vertices = vertices.ToArray();
                            selPolyShape.UpdatePolyStats();
                        }

                        DualityEditorApp.NotifyObjPropChanged(this,
                                                              new ObjectSelection(this.selectedBody),
                                                              ReflectionInfo.Property_RigidBody_Shapes);
                    }

                    this.LeaveCursorState();
                }
                #endregion
            }
            else if (this.mouseState == CursorState.CreateLoop)
            {
                #region CreateLoop
                if (e.Button == MouseButtons.Left)
                {
                    bool success = false;
                    if (!this.allObjSel.Any(sel => sel is SelLoopShape))
                    {
                        LoopShapeInfo newShape = new LoopShapeInfo(new Vector2[] { localPos, localPos + Vector2.UnitX, localPos + Vector2.One });
                        UndoRedoManager.Do(new CreateRigidBodyShapeAction(this.selectedBody, newShape));
                        this.SelectObjects(new[] { SelShape.Create(newShape) });
                        success = true;
                    }
                    else
                    {
                        SelLoopShape   selPolyShape = this.allObjSel.OfType <SelLoopShape>().First();
                        LoopShapeInfo  polyShape    = selPolyShape.ActualObject as LoopShapeInfo;
                        List <Vector2> vertices     = polyShape.Vertices.ToList();
                        Vector2        lockedPos    = this.createPolyIndex > 0 ? vertices[this.createPolyIndex - 1] : Vector2.Zero;
                        MathF.TransformCoord(ref lockedPos.X, ref lockedPos.Y, selTransform.Angle);
                        MathF.TransformCoord(ref localPos.X, ref localPos.Y, selTransform.Angle);
                        localPos = this.ApplyAxisLock(localPos, lockedPos);
                        MathF.TransformCoord(ref localPos.X, ref localPos.Y, -selTransform.Angle);

                        vertices[this.createPolyIndex] = localPos;
                        if (this.createPolyIndex >= vertices.Count - 1)
                        {
                            vertices.Add(localPos);
                        }

                        polyShape.Vertices = vertices.ToArray();
                        selPolyShape.UpdateLoopStats();
                        success = true;
                    }

                    if (success)
                    {
                        this.createPolyIndex++;
                        DualityEditorApp.NotifyObjPropChanged(this,
                                                              new ObjectSelection(this.selectedBody),
                                                              ReflectionInfo.Property_RigidBody_Shapes);
                    }
                }
                else if (e.Button == MouseButtons.Right)
                {
                    if (this.allObjSel.Any(sel => sel is SelLoopShape))
                    {
                        SelLoopShape   selPolyShape = this.allObjSel.OfType <SelLoopShape>().First();
                        LoopShapeInfo  polyShape    = selPolyShape.ActualObject as LoopShapeInfo;
                        List <Vector2> vertices     = polyShape.Vertices.ToList();

                        vertices.RemoveAt(this.createPolyIndex);
                        if (vertices.Count < 3 || this.createPolyIndex < 2)
                        {
                            this.DeleteObjects(new SelLoopShape[] { selPolyShape });
                        }
                        else
                        {
                            polyShape.Vertices = vertices.ToArray();
                            selPolyShape.UpdateLoopStats();
                        }

                        DualityEditorApp.NotifyObjPropChanged(this,
                                                              new ObjectSelection(this.selectedBody),
                                                              ReflectionInfo.Property_RigidBody_Shapes);
                    }

                    this.LeaveCursorState();
                }
                #endregion
            }
            //else if (this.mouseState == CursorState.CreateEdge)
            //{
            //    #region CreateEdge
            //    if (e.Button == MouseButtons.Left)
            //    {
            //        bool success = false;
            //        if (!this.allObjSel.Any(sel => sel is SelEdgeShape))
            //        {
            //            EdgeShapeInfo newShape = new EdgeShapeInfo(localPos, localPos + Vector2.UnitX);

            //            this.selectedCollider.AddShape(newShape);
            //            this.SelectObjects(new[] { SelShape.Create(newShape) });
            //            success = true;
            //        }
            //        else
            //        {
            //            SelEdgeShape selEdgeShape = this.allObjSel.OfType<SelEdgeShape>().First();
            //            EdgeShapeInfo edgeShape = selEdgeShape.ActualObject as EdgeShapeInfo;

            //            switch (this.createPolyIndex)
            //            {
            //                case 0:	edgeShape.VertexStart = localPos;	break;
            //                case 1:	edgeShape.VertexEnd = localPos;		break;
            //            }

            //            selEdgeShape.UpdateEdgeStats();
            //            success = true;
            //        }

            //        if (success)
            //        {
            //            this.createPolyIndex++;
            //            DualityEditorApp.NotifyObjPropChanged(this,
            //                new ObjectSelection(this.selectedCollider),
            //                ReflectionInfo.Property_RigidBody_Shapes);

            //            if (this.createPolyIndex >= 2)
            //                this.LeaveCursorState();
            //        }
            //    }
            //    else if (e.Button == MouseButtons.Right)
            //    {
            //        if (this.allObjSel.Any(sel => sel is SelEdgeShape))
            //        {
            //            SelEdgeShape selEdgeShape = this.allObjSel.OfType<SelEdgeShape>().First();
            //            EdgeShapeInfo edgeShape = selEdgeShape.ActualObject as EdgeShapeInfo;

            //            if (this.createPolyIndex < 1)
            //                this.DeleteObjects(new SelEdgeShape[] { selEdgeShape });
            //            else
            //                selEdgeShape.UpdateEdgeStats();

            //            DualityEditorApp.NotifyObjPropChanged(this,
            //                new ObjectSelection(this.selectedCollider),
            //                ReflectionInfo.Property_RigidBody_Shapes);
            //        }

            //        this.LeaveCursorState();
            //    }
            //    #endregion
            //}
        }