Editor/DoubleClickMeshMode.cs
using System.Linq;
using System.Threading.Tasks;
namespace Editor;
/// <summary>
/// Double-click on a GameObject to enter Mesh Tool mode
/// </summary>
public static class DoubleClickMeshMode
{
private static bool _wasDoubleClick = false;
[EditorEvent.Frame]
public static void OnFrame()
{
// Skip if disabled or playing
if ( !MappingToolSettings.DoubleClickToMeshMode || Game.IsPlaying )
return;
var sceneView = SceneViewWidget.Current;
if ( sceneView?.LastSelectedViewportWidget == null )
return;
// Get double-click state from the viewport's gizmo instance
var gizmoInstance = sceneView.LastSelectedViewportWidget.GizmoInstance;
if ( gizmoInstance == null )
return;
bool isDoubleClick = gizmoInstance.Input.DoubleClick;
// Detect rising edge of double-click
if ( isDoubleClick && !_wasDoubleClick )
{
_ = HandleDoubleClickAsync();
}
_wasDoubleClick = isDoubleClick;
}
[EditorEvent.Hotload]
public static void OnHotload()
{
_wasDoubleClick = false;
}
private static async Task HandleDoubleClickAsync()
{
var session = SceneEditorSession.Active;
if ( session == null )
return;
// Check if we have a GameObject selected
var selectedObjects = session.Selection.OfType<GameObject>().ToList();
if ( selectedObjects.Count == 0 )
return;
// Check if any selected object has a MeshComponent (editable mesh)
var hasMeshComponent = selectedObjects.Any( go => go.GetComponent<MeshComponent>() != null );
if ( !hasMeshComponent )
return;
// Check if we're already in mesh tool
var sceneView = SceneViewWidget.Current;
var currentTool = sceneView?.Tools?.CurrentTool;
if ( currentTool is Editor.MeshEditor.MeshTool )
return;
// Switch to mesh tool
EditorToolManager.SetTool( "MeshTool" );
Log.Info( "DoubleClick: Entered Mesh Tool mode" );
// Wait for tool to initialize
await Task.Delay( 50 );
// Switch to MeshSelection (Object mode) instead of Primitive
var meshTool = sceneView?.Tools?.CurrentTool as Editor.MeshEditor.MeshTool;
if ( meshTool != null )
{
var tools = meshTool.Tools.ToList();
var meshSelection = tools.FirstOrDefault( t => t.GetType().Name == "MeshSelection" );
if ( meshSelection != null )
{
meshTool.CurrentTool = meshSelection;
Log.Info( "DoubleClick: Switched to Object selection mode" );
}
}
}
}