diff --git a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs
index e95364c2d..4cd63f05d 100644
--- a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs
+++ b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs
@@ -47,6 +47,11 @@ namespace FlaxEditor.SceneGraph.Actors
}
}
+ ///
+ /// Gets the model used by this actor.
+ ///
+ public Model Model => ((StaticModel)Actor).Model;
+
///
public StaticModelNode(Actor actor)
: base(actor)
@@ -120,12 +125,12 @@ namespace FlaxEditor.SceneGraph.Actors
{
base.OnContextMenu(contextMenu, window);
- // Check if every selected node is a primitive
+ // Check if every selected node is a primitive or has collision asset
var selection = GetSelection(window);
bool autoOptionEnabled = true;
foreach (var node in selection)
{
- if (node is StaticModelNode staticModelNode && !staticModelNode.IsPrimitive)
+ if (node is StaticModelNode staticModelNode && (!staticModelNode.IsPrimitive && GetCollisionData(staticModelNode.Model) == null))
{
autoOptionEnabled = false;
break;
@@ -201,6 +206,54 @@ namespace FlaxEditor.SceneGraph.Actors
return Array.Empty();
}
+ private static bool TryCollisionData(Model model, BinaryAssetItem assetItem, out CollisionData collisionData)
+ {
+ collisionData = FlaxEngine.Content.Load(assetItem.ID);
+ if (collisionData)
+ {
+ var options = collisionData.Options;
+ if (options.Model == model.ID || options.Model == Guid.Empty)
+ return true;
+ }
+ return false;
+ }
+
+ private CollisionData GetCollisionData(Model model)
+ {
+ if (model == null)
+ return null;
+
+ // 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)
+ {
+ foreach (var child in modelItem.ParentFolder.Children)
+ {
+ // Check if there is collision that was made with this model
+ if (child is BinaryAssetItem b && b.IsOfType())
+ {
+ if (TryCollisionData(model, b, out var collisionData))
+ return collisionData;
+ }
+
+ // Check if there is an auto-imported collision
+ if (child is ContentFolder childFolder && childFolder.ShortName == modelItem.ShortName)
+ {
+ foreach (var childFolderChild in childFolder.Children)
+ {
+ if (childFolderChild is BinaryAssetItem c && c.IsOfType())
+ {
+ if (TryCollisionData(model, c, out var collisionData))
+ return collisionData;
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
private void CreateAuto(StaticModel actor, Spawner spawner, bool singleNode)
{
// Special case for in-built Editor models that can use analytical collision
@@ -243,6 +296,15 @@ namespace FlaxEditor.SceneGraph.Actors
collider.LocalPosition = new Vector3(0, 50.0f, 0);
collider.LocalOrientation = Quaternion.Euler(0, 0, 90.0f);
}
+ else
+ {
+ var collider = new MeshCollider
+ {
+ Transform = actor.Transform,
+ CollisionData = GetCollisionData(model),
+ };
+ spawner(collider);
+ }
}
private void CreateBox(StaticModel actor, Spawner spawner, bool singleNode)