Add reusing created collision data for model when UI requests it
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user