Files
sbox-public/game/addons/tools/Code/Scene/SceneView/DropObjects/TerrainDropObject.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

83 lines
1.8 KiB
C#

using Sandbox;
using System.Threading;
namespace Editor;
[DropObject( "terrain", "terrain" )]
partial class TerrainDropObject : BaseDropObject
{
Asset Asset;
protected override async Task Initialize( string dragData, CancellationToken token )
{
Asset = await InstallAsset( dragData, token );
if ( token.IsCancellationRequested )
return;
}
public override async Task OnDrop()
{
await WaitForLoad();
if ( Asset is null ) return;
var storage = Asset.LoadResource<TerrainStorage>();
if ( storage is null ) return;
using var scene = SceneEditorSession.Scope();
using ( SceneEditorSession.Active.UndoScope( "Drop Terrain" ).WithGameObjectCreations().Push() )
{
GameObject = new GameObject( true, storage.ResourceName );
var terrain = GameObject.Components.Create<Terrain>( false );
terrain.Storage = storage;
terrain.Enabled = true;
EditorScene.Selection.Clear();
EditorScene.Selection.Add( GameObject );
}
await Task.CompletedTask;
}
}
[DropObject( "terrainmaterial", "tmat" )]
partial class TerrainMaterialDropObject : BaseDropObject
{
TerrainMaterial material;
protected override async Task Initialize( string dragData, CancellationToken token )
{
Asset asset = await InstallAsset( dragData, token );
if ( asset is null )
return;
if ( token.IsCancellationRequested )
return;
material = asset.LoadResource<TerrainMaterial>();
}
public override async Task OnDrop()
{
await WaitForLoad();
if ( material is null ) return;
if ( !trace.GameObject.IsValid() ) return;
var c = trace.GameObject.Components.Get<Terrain>();
if ( c.IsValid() )
{
c.Storage.Materials.Add( material );
c.UpdateMaterialsBuffer();
EditorScene.Selection.Clear();
EditorScene.Selection.Add( trace.GameObject );
}
await Task.CompletedTask;
}
}