Add reusing created collision data for model when UI requests it

This commit is contained in:
Wojtek Figat
2021-02-18 11:12:36 +01:00
parent 9ee6104706
commit 161917977c
2 changed files with 35 additions and 12 deletions

View File

@@ -46,24 +46,47 @@ namespace FlaxEditor.Content
/// Create collision data from model. /// Create collision data from model.
/// </summary> /// </summary>
/// <param name="model">The associated model.</param> /// <param name="model">The associated model.</param>
public void CreateCollisionDataFromModel(Model model) /// <param name="created">The action to call once the collision data gets created (or reused from existing).</param>
public void CreateCollisionDataFromModel(Model model, Action<CollisionData> created = null)
{ {
Action<ContentItem> created = contentItem => // Check if there already is collision data for that model to reuse
var modelItem = (AssetItem)Editor.Instance.ContentDatabase.Find(model.ID);
if (modelItem?.ParentFolder != null)
{ {
var ai = (AssetItem)contentItem; foreach (var child in modelItem.ParentFolder.Children)
var cd = FlaxEngine.Content.LoadAsync<CollisionData>(ai.ID); {
if (cd == null || cd.WaitForLoaded()) if (child is BinaryAssetItem b && b.IsOfType<CollisionData>())
{
var collisionData = FlaxEngine.Content.Load<CollisionData>(b.ID);
if (collisionData && collisionData.Options.Model == model.ID)
{
Editor.Instance.Windows.ContentWin.Select(b);
if (created != null)
FlaxEngine.Scripting.InvokeOnUpdate(() => created(collisionData));
return;
}
}
}
}
// Create new item so user can name it and then generate collision for it in async
Action<ContentItem> create = contentItem =>
{
var assetItem = (AssetItem)contentItem;
var collisionData = FlaxEngine.Content.LoadAsync<CollisionData>(assetItem.ID);
if (collisionData == null || collisionData.WaitForLoaded())
{ {
Editor.LogError("Failed to load created collision data."); Editor.LogError("Failed to load created collision data.");
return; return;
} }
Task.Run(() => Task.Run(() =>
{ {
Editor.CookMeshCollision(ai.Path, CollisionDataType.TriangleMesh, model); Editor.CookMeshCollision(assetItem.Path, CollisionDataType.TriangleMesh, model);
}); if (created != null)
FlaxEngine.Scripting.InvokeOnUpdate(() => created(collisionData));
});
}; };
Editor.Instance.Windows.ContentWin.NewItem(this, null, created); Editor.Instance.Windows.ContentWin.NewItem(this, null, create);
} }
} }
} }

View File

@@ -45,11 +45,11 @@ namespace FlaxEditor.Content
{ {
base.OnContentWindowContextMenu(menu, item); base.OnContentWindowContextMenu(menu, item);
menu.AddButton("Generate collision data", () => menu.AddButton("Create collision data", () =>
{ {
var model = FlaxEngine.Content.LoadAsync<Model>(((ModelAssetItem)item).ID); var model = FlaxEngine.Content.LoadAsync<Model>(((ModelAssetItem)item).ID);
var cdProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy<CollisionData>(); var collisionDataProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy<CollisionData>();
cdProxy.CreateCollisionDataFromModel(model); collisionDataProxy.CreateCollisionDataFromModel(model);
}); });
} }