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); }
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); }
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(); }
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); }
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 //} }