Add support for custom drag&drop into level/prefab viewports from custom asset items

This commit is contained in:
Wojtek Figat
2021-05-24 18:34:19 +02:00
parent c78fb7995e
commit 2c7d62bb8e
13 changed files with 262 additions and 362 deletions

View File

@@ -568,121 +568,12 @@ namespace FlaxEditor.SceneGraph.GUI
{
for (int i = 0; i < _dragAssets.Objects.Count; i++)
{
var assetItem = _dragAssets.Objects[i];
if (assetItem.IsOfType<SkinnedModel>())
{
// Create actor
var model = FlaxEngine.Content.LoadAsync<SkinnedModel>(assetItem.ID);
var actor = new AnimatedModel
{
StaticFlags = Actor.StaticFlags,
Name = assetItem.ShortName,
SkinnedModel = model,
Transform = Actor.Transform
};
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
else if (assetItem.IsOfType<Model>())
{
// Create actor
var model = FlaxEngine.Content.LoadAsync<Model>(assetItem.ID);
var actor = new StaticModel
{
StaticFlags = Actor.StaticFlags,
Name = assetItem.ShortName,
Model = model,
Transform = Actor.Transform
};
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
else if (assetItem.IsOfType<CollisionData>())
{
// Create actor
var actor = new MeshCollider
{
StaticFlags = Actor.StaticFlags,
Name = assetItem.ShortName,
CollisionData = FlaxEngine.Content.LoadAsync<CollisionData>(assetItem.ID),
Transform = Actor.Transform
};
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
else if (assetItem.IsOfType<ParticleSystem>())
{
// Create actor
var actor = new ParticleEffect
{
StaticFlags = Actor.StaticFlags,
Name = assetItem.ShortName,
ParticleSystem = FlaxEngine.Content.LoadAsync<ParticleSystem>(assetItem.ID),
Transform = Actor.Transform
};
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
else if (assetItem.IsOfType<SceneAnimation>())
{
// Create actor
var actor = new SceneAnimationPlayer
{
StaticFlags = Actor.StaticFlags,
Name = assetItem.ShortName,
Animation = FlaxEngine.Content.LoadAsync<SceneAnimation>(assetItem.ID),
Transform = Actor.Transform
};
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
else if (assetItem.IsOfType<AudioClip>())
{
// Create actor
var actor = new AudioSource
{
StaticFlags = Actor.StaticFlags,
Name = assetItem.ShortName,
Clip = FlaxEngine.Content.LoadAsync<AudioClip>(assetItem.ID),
Transform = Actor.Transform
};
// Spawn
ActorNode.Root.Spawn(actor, Actor);
break;
}
else if (assetItem.IsOfType<Prefab>())
{
// Create prefab instance
var prefab = FlaxEngine.Content.LoadAsync<Prefab>(assetItem.ID);
var actor = PrefabManager.SpawnPrefab(prefab, null);
actor.StaticFlags = Actor.StaticFlags;
actor.Name = assetItem.ShortName;
actor.Transform = Actor.Transform;
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
else if (assetItem is VisualScriptItem visualScriptItem && new ScriptType(typeof(Actor)).IsAssignableFrom(visualScriptItem.ScriptType) && visualScriptItem.ScriptType.CanCreateInstance)
{
// Create actor
var actor = (Actor)visualScriptItem.ScriptType.CreateInstance();
actor.StaticFlags = Actor.StaticFlags;
actor.Name = assetItem.ShortName;
actor.Transform = Actor.Transform;
// Spawn
ActorNode.Root.Spawn(actor, Actor);
}
var item = _dragAssets.Objects[i];
var actor = item.OnEditorDrop(this);
actor.StaticFlags = Actor.StaticFlags;
actor.Name = item.ShortName;
actor.Transform = Actor.Transform;
ActorNode.Root.Spawn(actor, Actor);
}
result = DragDropEffect.Move;
@@ -737,46 +628,12 @@ namespace FlaxEditor.SceneGraph.GUI
return actorNode.Actor != null && actorNode != ActorNode && actorNode.Find(Actor) == null;
}
/// <summary>
/// Validates the asset for drag and drop into one of the scene tree nodes.
/// </summary>
/// <param name="assetItem">The item.</param>
/// <returns>True if can drag and drop it, otherwise false.</returns>
public static bool ValidateDragAsset(AssetItem assetItem)
private bool ValidateDragAsset(AssetItem assetItem)
{
if (assetItem.IsOfType<SkinnedModel>())
return true;
if (assetItem.IsOfType<Model>())
return true;
if (assetItem.IsOfType<AudioClip>())
return true;
if (assetItem.IsOfType<Prefab>())
return true;
if (assetItem.IsOfType<CollisionData>())
return true;
if (assetItem.IsOfType<ParticleSystem>())
return true;
if (assetItem.IsOfType<SceneAnimation>())
return true;
if (assetItem is VisualScriptItem visualScriptItem && new ScriptType(typeof(Actor)).IsAssignableFrom(visualScriptItem.ScriptType) && visualScriptItem.ScriptType.CanCreateInstance)
return true;
return false;
return assetItem.OnEditorDrag(this);
}
/// <summary>
/// Validates the type of the actor for drag and drop into one of the scene tree nodes.
/// </summary>
/// <param name="actorType">Type of the actor.</param>
/// <returns>True if can drag and drop it, otherwise false.</returns>
public static bool ValidateDragActorType(ScriptType actorType)
private static bool ValidateDragActorType(ScriptType actorType)
{
return true;
}