From fd756f7baed970c411e0fdec305f7cc1314cba68 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 22 Mar 2024 10:35:53 -0500 Subject: [PATCH 1/2] Allow multiple collision actors to be created from context menu. --- .../SceneGraph/Actors/StaticModelNode.cs | 138 ++++++++++-------- 1 file changed, 77 insertions(+), 61 deletions(-) diff --git a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs index 60be5bef9..d2fcd510b 100644 --- a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs +++ b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs @@ -89,71 +89,87 @@ namespace FlaxEditor.SceneGraph.Actors private void OnAddMeshCollider() { - var model = ((StaticModel)Actor).Model; - if (!model) - return; + // Allow collider to be added to evey static model selection + var selection = Editor.Instance.SceneEditing.Selection.ToArray(); + var createdNodes = new List(); + foreach (var node in selection) + { + if (node is not StaticModelNode staticModelNode) + continue; - // Special case for in-built Editor models that can use analytical collision - var modelPath = model.Path; - if (modelPath.EndsWith("/Primitives/Cube.flax", StringComparison.Ordinal)) - { - var actor = new BoxCollider - { - StaticFlags = Actor.StaticFlags, - Transform = Actor.Transform, - }; - Root.Spawn(actor, Actor); - return; - } - if (modelPath.EndsWith("/Primitives/Sphere.flax", StringComparison.Ordinal)) - { - var actor = new SphereCollider - { - StaticFlags = Actor.StaticFlags, - Transform = Actor.Transform, - }; - Root.Spawn(actor, Actor); - return; - } - if (modelPath.EndsWith("/Primitives/Plane.flax", StringComparison.Ordinal)) - { - var actor = new BoxCollider - { - StaticFlags = Actor.StaticFlags, - Transform = Actor.Transform, - Size = new Float3(100.0f, 100.0f, 1.0f), - }; - Root.Spawn(actor, Actor); - return; - } - if (modelPath.EndsWith("/Primitives/Capsule.flax", StringComparison.Ordinal)) - { - var actor = new CapsuleCollider - { - StaticFlags = Actor.StaticFlags, - Transform = Actor.Transform, - Radius = 25.0f, - Height = 50.0f, - }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); - actor.LocalPosition = new Vector3(0, 50.0f, 0); - actor.LocalOrientation = Quaternion.Euler(0, 0, 90.0f); - return; - } + var model = ((StaticModel)staticModelNode.Actor).Model; + if (!model) + continue; - // Create collision data (or reuse) and add collision actor - Action created = collisionData => - { - var actor = new MeshCollider + // Special case for in-built Editor models that can use analytical collision + var modelPath = model.Path; + if (modelPath.EndsWith("/Primitives/Cube.flax", StringComparison.Ordinal)) { - StaticFlags = Actor.StaticFlags, - Transform = Actor.Transform, - CollisionData = collisionData, + var actor = new BoxCollider + { + StaticFlags = staticModelNode.Actor.StaticFlags, + Transform = staticModelNode.Actor.Transform, + }; + staticModelNode.Root.Spawn(actor, staticModelNode.Actor); + createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + continue; + } + if (modelPath.EndsWith("/Primitives/Sphere.flax", StringComparison.Ordinal)) + { + var actor = new SphereCollider + { + StaticFlags = staticModelNode.Actor.StaticFlags, + Transform = staticModelNode.Actor.Transform, + }; + staticModelNode.Root.Spawn(actor, staticModelNode.Actor); + createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + continue; + } + if (modelPath.EndsWith("/Primitives/Plane.flax", StringComparison.Ordinal)) + { + var actor = new BoxCollider + { + StaticFlags = staticModelNode.Actor.StaticFlags, + Transform = staticModelNode.Actor.Transform, + Size = new Float3(100.0f, 100.0f, 1.0f), + }; + staticModelNode.Root.Spawn(actor, staticModelNode.Actor); + createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + continue; + } + if (modelPath.EndsWith("/Primitives/Capsule.flax", StringComparison.Ordinal)) + { + var actor = new CapsuleCollider + { + StaticFlags = staticModelNode.Actor.StaticFlags, + Transform = staticModelNode.Actor.Transform, + Radius = 25.0f, + Height = 50.0f, + }; + Editor.Instance.SceneEditing.Spawn(actor, staticModelNode.Actor); + actor.LocalPosition = new Vector3(0, 50.0f, 0); + actor.LocalOrientation = Quaternion.Euler(0, 0, 90.0f); + createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + continue; + } + + // Create collision data (or reuse) and add collision actor + Action created = collisionData => + { + var actor = new MeshCollider + { + StaticFlags = staticModelNode.Actor.StaticFlags, + Transform = staticModelNode.Actor.Transform, + CollisionData = collisionData, + }; + staticModelNode.Root.Spawn(actor, staticModelNode.Actor); + createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); }; - Root.Spawn(actor, Actor); - }; - var collisionDataProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy(); - collisionDataProxy.CreateCollisionDataFromModel(model, created); + var collisionDataProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy(); + collisionDataProxy.CreateCollisionDataFromModel(model, created); + } + // Select all created nodes + Editor.Instance.SceneEditing.Select(createdNodes); } } } From 981fe9482cc38d90be308d46de63817becbffad3 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Sun, 24 Mar 2024 15:51:33 -0500 Subject: [PATCH 2/2] Fix multi collider to work in prefab window. --- .../SceneGraph/Actors/StaticModelNode.cs | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs index d2fcd510b..65bea6c32 100644 --- a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs +++ b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using FlaxEditor.Content; using FlaxEditor.GUI.ContextMenu; using FlaxEditor.Windows; +using FlaxEditor.Windows.Assets; using FlaxEngine; namespace FlaxEditor.SceneGraph.Actors @@ -84,13 +85,22 @@ namespace FlaxEditor.SceneGraph.Actors { base.OnContextMenu(contextMenu, window); - contextMenu.AddButton("Add collider", OnAddMeshCollider).Enabled = ((StaticModel)Actor).Model != null; + contextMenu.AddButton("Add collider", () => OnAddMeshCollider(window)).Enabled = ((StaticModel)Actor).Model != null; } - private void OnAddMeshCollider() + private void OnAddMeshCollider(EditorWindow window) { // Allow collider to be added to evey static model selection - var selection = Editor.Instance.SceneEditing.Selection.ToArray(); + SceneGraphNode[] selection = Array.Empty(); + if (window is SceneTreeWindow) + { + selection = Editor.Instance.SceneEditing.Selection.ToArray(); + } + else if (window is PrefabWindow prefabWindow) + { + selection = prefabWindow.Selection.ToArray(); + } + var createdNodes = new List(); foreach (var node in selection) { @@ -111,7 +121,7 @@ namespace FlaxEditor.SceneGraph.Actors Transform = staticModelNode.Actor.Transform, }; staticModelNode.Root.Spawn(actor, staticModelNode.Actor); - createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + createdNodes.Add(window is PrefabWindow pWindow ? pWindow.Graph.Root.Find(actor) : Editor.Instance.Scene.GetActorNode(actor)); continue; } if (modelPath.EndsWith("/Primitives/Sphere.flax", StringComparison.Ordinal)) @@ -122,7 +132,7 @@ namespace FlaxEditor.SceneGraph.Actors Transform = staticModelNode.Actor.Transform, }; staticModelNode.Root.Spawn(actor, staticModelNode.Actor); - createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + createdNodes.Add(window is PrefabWindow pWindow ? pWindow.Graph.Root.Find(actor) : Editor.Instance.Scene.GetActorNode(actor)); continue; } if (modelPath.EndsWith("/Primitives/Plane.flax", StringComparison.Ordinal)) @@ -134,7 +144,7 @@ namespace FlaxEditor.SceneGraph.Actors Size = new Float3(100.0f, 100.0f, 1.0f), }; staticModelNode.Root.Spawn(actor, staticModelNode.Actor); - createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + createdNodes.Add(window is PrefabWindow pWindow ? pWindow.Graph.Root.Find(actor) : Editor.Instance.Scene.GetActorNode(actor)); continue; } if (modelPath.EndsWith("/Primitives/Capsule.flax", StringComparison.Ordinal)) @@ -149,7 +159,7 @@ namespace FlaxEditor.SceneGraph.Actors Editor.Instance.SceneEditing.Spawn(actor, staticModelNode.Actor); actor.LocalPosition = new Vector3(0, 50.0f, 0); actor.LocalOrientation = Quaternion.Euler(0, 0, 90.0f); - createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + createdNodes.Add(window is PrefabWindow pWindow ? pWindow.Graph.Root.Find(actor) : Editor.Instance.Scene.GetActorNode(actor)); continue; } @@ -163,13 +173,21 @@ namespace FlaxEditor.SceneGraph.Actors CollisionData = collisionData, }; staticModelNode.Root.Spawn(actor, staticModelNode.Actor); - createdNodes.Add(Editor.Instance.Scene.GetActorNode(actor)); + createdNodes.Add(window is PrefabWindow pWindow ? pWindow.Graph.Root.Find(actor) : Editor.Instance.Scene.GetActorNode(actor)); }; var collisionDataProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy(); - collisionDataProxy.CreateCollisionDataFromModel(model, created); + collisionDataProxy.CreateCollisionDataFromModel(model, created, selection.Length == 1); } + // Select all created nodes - Editor.Instance.SceneEditing.Select(createdNodes); + if (window is SceneTreeWindow) + { + Editor.Instance.SceneEditing.Select(createdNodes); + } + else if (window is PrefabWindow pWindow) + { + pWindow.Select(createdNodes); + } } } }