From d0e509a8fc7861882dbe376543fca63b0ffd9ef8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Perrier Date: Mon, 21 Dec 2020 23:20:42 +0100 Subject: [PATCH] Adding "Generate collision data" from Model context menu. --- .../Content/Proxy/CollisionDataProxy.cs | 25 +++++++++++++++++++ .../Windows/ContentWindow.ContextMenu.cs | 9 +++++++ 2 files changed, 34 insertions(+) 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))