From 954cf3eb5b42027d8ad51ab58d1a6cf8235708aa Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 23 May 2025 17:57:14 -0500 Subject: [PATCH 1/2] Add option to show verticies and triangles of collision model in a collider data window. --- .../Windows/Assets/CollisionDataWindow.cs | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/Source/Editor/Windows/Assets/CollisionDataWindow.cs b/Source/Editor/Windows/Assets/CollisionDataWindow.cs index 3f265eea9..4b10be943 100644 --- a/Source/Editor/Windows/Assets/CollisionDataWindow.cs +++ b/Source/Editor/Windows/Assets/CollisionDataWindow.cs @@ -7,6 +7,7 @@ using FlaxEditor.Content.Create; using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors.Editors; using FlaxEditor.CustomEditors.Elements; +using FlaxEditor.GUI; using FlaxEditor.Viewport.Cameras; using FlaxEditor.Viewport.Previews; using FlaxEngine; @@ -171,13 +172,52 @@ namespace FlaxEditor.Windows.Assets } private readonly SplitPanel _split; - private readonly ModelBasePreview _preview; + private readonly CollisionDataPreview _preview; private readonly CustomEditorPresenter _propertiesPresenter; private readonly PropertiesProxy _properties; private Model _collisionWiresModel; private StaticModel _collisionWiresShowActor; private bool _updateWireMesh; + private class CollisionDataPreview : ModelBasePreview + { + public bool ShowCollisionData = false; + public Model CollisionWireModel; + + /// + public CollisionDataPreview(bool useWidgets) + : base(useWidgets) + { + ViewportCamera = new FPSCamera(); + Task.ViewFlags &= ~ViewFlags.Sky & ~ViewFlags.Bloom & ~ViewFlags.EyeAdaptation; + } + + /// + public override void Draw() + { + base.Draw(); + + if (ShowCollisionData && CollisionWireModel != null) + { + var lods = CollisionWireModel.LODs; + var lod = lods[0]; + int triangleCount = 0, vertexCount = 0; + for (int meshIndex = 0; meshIndex < lod.Meshes.Length; meshIndex++) + { + var mesh = lod.Meshes[meshIndex]; + triangleCount += mesh.TriangleCount; + vertexCount += mesh.VertexCount; + } + + var text = string.Format("\nTriangles: {0:N0}\nVertices: {1:N0}", triangleCount, vertexCount); + var font = Style.Current.FontMedium; + var pos = new Float2(10, 50); + Render2D.DrawText(font, text, new Rectangle(pos + Float2.One, Size), Color.Black); + Render2D.DrawText(font, text, new Rectangle(pos, Size), Color.White); + } + } + } + /// public CollisionDataWindow(Editor editor, AssetItem item) : base(editor, item) @@ -185,6 +225,12 @@ namespace FlaxEditor.Windows.Assets // Toolstrip _toolstrip.AddSeparator(); _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.ResetCamera()).LinkTooltip("Show whole collision"); + var infoButton = (ToolStripButton)_toolstrip.AddButton(editor.Icons.Info64).LinkTooltip("Show Collision Data"); + infoButton.Clicked += () => + { + _preview.ShowCollisionData = !_preview.ShowCollisionData; + infoButton.Checked = _preview.ShowCollisionData; + }; _toolstrip.AddButton(editor.Icons.Docs64, () => Platform.OpenUrl(Utilities.Constants.DocsUrl + "manual/physics/colliders/collision-data.html")).LinkTooltip("See documentation to learn more"); // Split Panel @@ -197,12 +243,10 @@ namespace FlaxEditor.Windows.Assets }; // Model preview - _preview = new ModelBasePreview(true) + _preview = new CollisionDataPreview(true) { - ViewportCamera = new FPSCamera(), Parent = _split.Panel1 }; - _preview.Task.ViewFlags &= ~ViewFlags.Sky & ~ViewFlags.Bloom & ~ViewFlags.EyeAdaptation; // Asset properties _propertiesPresenter = new CustomEditorPresenter(null); @@ -252,6 +296,7 @@ namespace FlaxEditor.Windows.Assets } _collisionWiresShowActor.Model = _collisionWiresModel; _collisionWiresShowActor.SetMaterial(0, FlaxEngine.Content.LoadAsyncInternal(EditorAssets.WiresDebugMaterial)); + _preview.CollisionWireModel = _collisionWiresModel; _preview.Asset = FlaxEngine.Content.LoadAsync(_asset.Options.Model); } From 6b78b498f7426e1627af5e100c6f71ded8c4623f Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 4 Jun 2025 10:17:41 -0500 Subject: [PATCH 2/2] Use direct count from internal call. --- .../Windows/Assets/CollisionDataWindow.cs | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/Source/Editor/Windows/Assets/CollisionDataWindow.cs b/Source/Editor/Windows/Assets/CollisionDataWindow.cs index 4b10be943..8fa32f890 100644 --- a/Source/Editor/Windows/Assets/CollisionDataWindow.cs +++ b/Source/Editor/Windows/Assets/CollisionDataWindow.cs @@ -182,7 +182,14 @@ namespace FlaxEditor.Windows.Assets private class CollisionDataPreview : ModelBasePreview { public bool ShowCollisionData = false; - public Model CollisionWireModel; + private int _verticesCount = 0; + private int _trianglesCount = 0; + + public void SetVerticesAndTriangleCount(int verticesCount, int triangleCount) + { + _verticesCount = verticesCount; + _trianglesCount = triangleCount; + } /// public CollisionDataPreview(bool useWidgets) @@ -197,19 +204,9 @@ namespace FlaxEditor.Windows.Assets { base.Draw(); - if (ShowCollisionData && CollisionWireModel != null) + if (ShowCollisionData) { - var lods = CollisionWireModel.LODs; - var lod = lods[0]; - int triangleCount = 0, vertexCount = 0; - for (int meshIndex = 0; meshIndex < lod.Meshes.Length; meshIndex++) - { - var mesh = lod.Meshes[meshIndex]; - triangleCount += mesh.TriangleCount; - vertexCount += mesh.VertexCount; - } - - var text = string.Format("\nTriangles: {0:N0}\nVertices: {1:N0}", triangleCount, vertexCount); + var text = string.Format("\nTriangles: {0:N0}\nVertices: {1:N0}\nMemory Size: {2:N0} bytes", _trianglesCount, _verticesCount, Asset.MemoryUsage); var font = Style.Current.FontMedium; var pos = new Float2(10, 50); Render2D.DrawText(font, text, new Rectangle(pos + Float2.One, Size), Color.Black); @@ -284,7 +281,7 @@ namespace FlaxEditor.Windows.Assets _collisionWiresModel = FlaxEngine.Content.CreateVirtualAsset(); _collisionWiresModel.SetupLODs(new[] { 1 }); } - Editor.Internal_GetCollisionWires(FlaxEngine.Object.GetUnmanagedPtr(Asset), out var triangles, out var indices, out var _, out var _); + Editor.Internal_GetCollisionWires(FlaxEngine.Object.GetUnmanagedPtr(Asset), out var triangles, out var indices, out var triangleCount, out var indicesCount); if (triangles != null && indices != null) _collisionWiresModel.LODs[0].Meshes[0].UpdateMesh(triangles, indices); else @@ -296,7 +293,7 @@ namespace FlaxEditor.Windows.Assets } _collisionWiresShowActor.Model = _collisionWiresModel; _collisionWiresShowActor.SetMaterial(0, FlaxEngine.Content.LoadAsyncInternal(EditorAssets.WiresDebugMaterial)); - _preview.CollisionWireModel = _collisionWiresModel; + _preview.SetVerticesAndTriangleCount(triangleCount, indicesCount / 3); _preview.Asset = FlaxEngine.Content.LoadAsync(_asset.Options.Model); }