diff --git a/Source/Editor/Content/Proxy/CollisionDataProxy.cs b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
index 64b3aa62f..4f7561c02 100644
--- a/Source/Editor/Content/Proxy/CollisionDataProxy.cs
+++ b/Source/Editor/Content/Proxy/CollisionDataProxy.cs
@@ -1,6 +1,7 @@
// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
using System;
+using System.Threading.Tasks;
using FlaxEditor.Windows;
using FlaxEditor.Windows.Assets;
using FlaxEngine;
@@ -40,5 +41,29 @@ namespace FlaxEditor.Content
if (Editor.CreateAsset(Editor.NewAssetType.CollisionData, outputPath))
throw new Exception("Failed to create new asset.");
}
+
+ ///
+ /// Create collision data from model.
+ ///
+ /// The associated model.
+ public void CreateCollisionDataFromModel(Model model)
+ {
+ Action created = contentItem =>
+ {
+ var ai = (AssetItem)contentItem;
+ var cd = FlaxEngine.Content.LoadAsync(ai.ID);
+ if (cd == null || cd.WaitForLoaded())
+ {
+ Editor.LogError("Failed to load created collision data.");
+ return;
+ }
+
+ Task.Run(() =>
+ {
+ Editor.CookMeshCollision(ai.Path, CollisionDataType.TriangleMesh, model);
+ });
+ };
+ Editor.Instance.Windows.ContentWin.NewItem(this, null, created);
+ }
}
}
diff --git a/Source/Editor/Windows/ContentWindow.ContextMenu.cs b/Source/Editor/Windows/ContentWindow.ContextMenu.cs
index d273ead49..f11ca2f53 100644
--- a/Source/Editor/Windows/ContentWindow.ContextMenu.cs
+++ b/Source/Editor/Windows/ContentWindow.ContextMenu.cs
@@ -89,6 +89,15 @@ namespace FlaxEditor.Windows
if (item is AssetItem assetItem)
{
cm.AddButton("Copy asset ID", () => Clipboard.Text = JsonSerializer.GetStringID(assetItem.ID));
+ if (item is ModelAssetItem modelAssetItem)
+ {
+ cm.AddButton("Generate collision data", () =>
+ {
+ var model = FlaxEngine.Content.Load(assetItem.ID);
+ var cdProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy();
+ cdProxy.CreateCollisionDataFromModel(model);
+ });
+ }
}
if (Editor.CanExport(item.Path))