Files
sbox-public/game/editor/Hammer/Code/DropTargets/ScenePrefabDropTarget.cs
s&box team 71f266059a Open source release
This commit imports the C# engine code and game files, excluding C++ source code.

[Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
2025-11-24 09:05:18 +00:00

100 lines
2.4 KiB
C#

using Editor.MapDoc;
using System.Diagnostics;
namespace Editor.MapEditor;
[CanDrop( "prefab" )]
class PrefabDropTarget : IMapViewDropTarget
{
MapGameObject PrefabGameObject { get; set; }
BBox Bounds { get; set; }
Vector3 PivotPosition { get; set; }
public void DragEnter( Package package, MapView view )
{
// ...
}
public void DragEnter( Asset asset, MapView view )
{
var pf = asset.LoadResource<PrefabFile>();
if ( pf is null ) return;
if ( SceneEditorSession.Active.Scene is PrefabScene prefabScene )
{
var currentPf = prefabScene.ToPrefabFile();
if ( currentPf.ResourceId == pf.ResourceId )
{
Log.Warning( "Cannot place the same prefab in itself." );
return;
}
}
var scene = view.MapDoc.World.Scene;
using ( scene.Push() )
{
var go = SceneUtility.GetPrefabScene( pf );
var GameObject = go.Clone();
GameObject.Flags = GameObjectFlags.NotSaved | GameObjectFlags.Hidden;
GameObject.Tags.Add( "isdragdrop" );
Bounds = GameObject.GetBounds();
if ( Bounds.Size.Length < 4 )
Bounds = BBox.FromPositionAndSize( 0, 4 );
PivotPosition = Bounds.ClosestPoint( Vector3.Down * 10000 );
PrefabGameObject = new( gameObject: GameObject );
}
}
public void DragMove( MapView view )
{
if ( !PrefabGameObject.IsValid() )
return;
view.BuildRay( out Vector3 rayStart, out Vector3 rayEnd );
var tr = Trace.Ray( rayStart, rayEnd ).Run( view.MapDoc.World );
var rot = Rotation.LookAt( tr.Normal, Vector3.Up ) * Rotation.From( 90, 0, 0 );
var pos = tr.HitPosition + tr.Normal * PivotPosition.Length;
PrefabGameObject.Position = pos;
PrefabGameObject.Angles = rot.Angles();
traceTransform = new Transform( pos, rot );
}
Transform traceTransform;
public void DrawGizmos( MapView view )
{
using var scope = Gizmo.Scope( "DropObject", traceTransform );
Gizmo.Draw.Color = Color.White.WithAlpha( 0.3f );
Gizmo.Draw.LineBBox( Bounds );
}
public void DragLeave( MapView view )
{
if ( PrefabGameObject.IsValid() ) view.MapDoc.DeleteNode( PrefabGameObject );
}
public void DragDropped( MapView view )
{
if ( !PrefabGameObject.IsValid() ) return;
var go = PrefabGameObject.GameObject;
go.Flags = GameObjectFlags.None;
go.Tags.Remove( "isdragdrop" );
History.MarkUndoPosition( "New Scene Prefab" );
History.KeepNew( PrefabGameObject );
Selection.Clear();
Selection.Add( PrefabGameObject );
PrefabGameObject = null;
}
}