diff --git a/Source/Editor/Content/Proxy/CollisionDataProxy.cs b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
index 91a573f1a..c23730375 100644
--- a/Source/Editor/Content/Proxy/CollisionDataProxy.cs
+++ b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
@@ -46,24 +46,47 @@ namespace FlaxEditor.Content
/// Create collision data from model.
///
/// The associated model.
- public void CreateCollisionDataFromModel(Model model)
+ /// The action to call once the collision data gets created (or reused from existing).
+ public void CreateCollisionDataFromModel(Model model, Action created = null)
{
- Action 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;
- var cd = FlaxEngine.Content.LoadAsync(ai.ID);
- if (cd == null || cd.WaitForLoaded())
+ foreach (var child in modelItem.ParentFolder.Children)
+ {
+ if (child is BinaryAssetItem b && b.IsOfType())
+ {
+ var collisionData = FlaxEngine.Content.Load(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 create = contentItem =>
+ {
+ var assetItem = (AssetItem)contentItem;
+ var collisionData = FlaxEngine.Content.LoadAsync(assetItem.ID);
+ if (collisionData == null || collisionData.WaitForLoaded())
{
Editor.LogError("Failed to load created collision data.");
return;
}
-
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);
}
}
}
diff --git a/Source/Editor/Content/Proxy/ModelProxy.cs b/Source/Editor/Content/Proxy/ModelProxy.cs
index 1c58139db..00caa1f07 100644
--- a/Source/Editor/Content/Proxy/ModelProxy.cs
+++ b/Source/Editor/Content/Proxy/ModelProxy.cs
@@ -45,11 +45,11 @@ namespace FlaxEditor.Content
{
base.OnContentWindowContextMenu(menu, item);
- menu.AddButton("Generate collision data", () =>
+ menu.AddButton("Create collision data", () =>
{
var model = FlaxEngine.Content.LoadAsync(((ModelAssetItem)item).ID);
- var cdProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy();
- cdProxy.CreateCollisionDataFromModel(model);
+ var collisionDataProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy();
+ collisionDataProxy.CreateCollisionDataFromModel(model);
});
}