Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }