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