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); }); }