/// <inheritdoc /> protected override DragDropEffect OnDragDropHeader(DragData data) { var result = DragDropEffect.None; Actor myActor = Actor; Actor newParent; int newOrder = -1; // Check if has no actor (only for Root Actor) if (myActor == null) { // Append to the last scene var scenes = SceneManager.Scenes; if (scenes == null || scenes.Length == 0) { throw new InvalidOperationException("No scene loaded."); } newParent = scenes[scenes.Length - 1]; } else { newParent = myActor; // Use drag positioning to change target parent and index if (_dragOverMode == DragItemPositioning.Above) { if (myActor.HasParent) { newParent = myActor.Parent; newOrder = myActor.OrderInParent; } } else if (_dragOverMode == DragItemPositioning.Below) { if (myActor.HasParent) { newParent = myActor.Parent; newOrder = myActor.OrderInParent + 1; } } } if (newParent == null) { throw new InvalidOperationException("Missing parent actor."); } // Drag actors if (_dragActors != null && _dragActors.HasValidDrag) { bool worldPositionLock = ParentWindow.GetKey(Keys.Control) == false; var singleObject = _dragActors.Objects.Count == 1; if (singleObject) { var targetActor = _dragActors.Objects[0].Actor; using (new UndoBlock(Editor.Instance.Undo, targetActor, "Change actor parent")) { targetActor.SetParent(newParent, worldPositionLock); targetActor.OrderInParent = newOrder; } } else { var targetActors = _dragActors.Objects.ConvertAll(x => x.Actor); using (new UndoMultiBlock(Editor.Instance.Undo, targetActors, "Change actors parent")) { for (int i = 0; i < targetActors.Count; i++) { var targetActor = targetActors[i]; targetActor.SetParent(newParent, worldPositionLock); targetActor.OrderInParent = newOrder; } } } result = DragDropEffect.Move; } // Drag assets else if (_dragAssets != null && _dragAssets.HasValidDrag) { for (int i = 0; i < _dragAssets.Objects.Count; i++) { var item = _dragAssets.Objects[i]; switch (item.ItemDomain) { case ContentDomain.Model: { // Create actor var model = FlaxEngine.Content.LoadAsync <Model>(item.ID); var actor = ModelActor.New(); actor.StaticFlags = Actor.StaticFlags; actor.Name = item.ShortName; actor.Model = model; actor.Transform = Actor.Transform; // Spawn Editor.Instance.SceneEditing.Spawn(actor, Actor); break; } case ContentDomain.Other: { if (item.TypeName == typeof(CollisionData).FullName) { // Create actor var actor = MeshCollider.New(); actor.StaticFlags = Actor.StaticFlags; actor.Name = item.ShortName; actor.CollisionData = FlaxEngine.Content.LoadAsync <CollisionData>(item.ID); actor.Transform = Actor.Transform; // Spawn Editor.Instance.SceneEditing.Spawn(actor, Actor); } break; } case ContentDomain.Audio: { var actor = AudioSource.New(); actor.StaticFlags = Actor.StaticFlags; actor.Name = item.ShortName; actor.Clip = FlaxEngine.Content.LoadAsync <AudioClip>(item.ID); actor.Transform = Actor.Transform; Editor.Instance.SceneEditing.Spawn(actor, Actor); break; } case ContentDomain.Prefab: { throw new NotImplementedException("Spawning prefabs"); } } } result = DragDropEffect.Move; } // Drag actor type else if (_dragActorType != null && _dragActorType.HasValidDrag) { for (int i = 0; i < _dragActorType.Objects.Count; i++) { var item = _dragActorType.Objects[i]; // Create actor var actor = FlaxEngine.Object.New(item) as Actor; if (actor == null) { Editor.LogWarning("Failed to spawn actor of type " + item.FullName); continue; } actor.StaticFlags = Actor.StaticFlags; actor.Name = item.Name; actor.Transform = Actor.Transform; // Spawn Editor.Instance.SceneEditing.Spawn(actor, Actor); } result = DragDropEffect.Move; } // Clear cache _dragActors?.OnDragDrop(); _dragAssets?.OnDragDrop(); _dragActorType?.OnDragDrop(); // Check if scene has been modified if (result != DragDropEffect.None) { var node = SceneGraphFactory.FindNode(newParent.ID) as ActorNode; node?.TreeNode.Expand(); } return(result); }
/// <inheritdoc /> public override DragDropEffect OnDragDrop(ref Vector2 location, DragData data) { var result = base.OnDragDrop(ref location, data); if (result != DragDropEffect.None) { return(result); } if (_dragOverItems.HasValidDrag) { result = _dragOverItems.Effect; var surfaceLocation = _surface.PointFromParent(location); switch (Type) { case SurfaceType.Material: { for (int i = 0; i < _dragOverItems.Objects.Count; i++) { var item = _dragOverItems.Objects[i]; SurfaceNode node = null; switch (item.ItemDomain) { case ContentDomain.Texture: { // Check if it's a normal map bool isNormalMap = false; var obj = FlaxEngine.Content.LoadAsync <Texture>(item.ID); if (obj) { Thread.Sleep(50); if (!obj.WaitForLoaded()) { isNormalMap = obj.IsNormalMap; } } node = SpawnNode(5, (ushort)(isNormalMap ? 4 : 1), surfaceLocation, new object[] { item.ID }); break; } case ContentDomain.CubeTexture: { node = SpawnNode(5, 3, surfaceLocation, new object[] { item.ID }); break; } case ContentDomain.Material: { node = SpawnNode(8, 1, surfaceLocation, new object[] { item.ID }); break; } } if (node != null) { surfaceLocation.X += node.Width + 10; } } break; } case SurfaceType.AnimationGraph: { for (int i = 0; i < _dragOverItems.Objects.Count; i++) { var item = _dragOverItems.Objects[i]; SurfaceNode node = null; switch (item.ItemDomain) { case ContentDomain.Animation: { node = SpawnNode(9, 2, surfaceLocation, new object[] { item.ID, 1.0f, true, 0.0f, }); break; } case ContentDomain.SkeletonMask: { node = SpawnNode(9, 11, surfaceLocation, new object[] { 0.0f, item.ID, }); break; } } if (node != null) { surfaceLocation.X += node.Width + 10; } } break; } } _dragOverItems.OnDragDrop(); } else if (_dragOverParameter.HasValidDrag) { result = _dragOverParameter.Effect; var surfaceLocation = _surface.PointFromParent(location); var parameter = GetParameter(_dragOverParameter.Parameter); if (parameter == null) { throw new InvalidDataException(); } var node = SpawnNode(6, 1, surfaceLocation, new object[] { parameter.ID }); _dragOverParameter.OnDragDrop(); } return(result); }