mirror of
https://github.com/Facepunch/sbox-public.git
synced 2026-01-10 15:28:37 -05:00
This commit imports the C# engine code and game files, excluding C++ source code. [Source-Commit: ceb3d758046e50faa6258bc3b658a30c97743268]
83 lines
2.4 KiB
C#
83 lines
2.4 KiB
C#
using Editor.MapDoc;
|
|
using Editor.MeshEditor;
|
|
using Native;
|
|
|
|
namespace Editor.MapEditor;
|
|
|
|
/// <summary>
|
|
/// Interface for the addon layer to implement, this is called from native Hammer.
|
|
/// </summary>
|
|
public interface IBlockTool
|
|
{
|
|
public static IBlockTool Instance { get; set; }
|
|
|
|
public PrimitiveBuilder Current { get; set; }
|
|
public bool InProgress { get; set; }
|
|
public string EntityOverride { get; set; }
|
|
|
|
public Widget BuildUI();
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Tells the tool a parameter has changed and that we should redraw.
|
|
/// </summary>
|
|
public static void UpdateTool()
|
|
{
|
|
if ( !BlockToolGlue.ToolBlock.IsValid )
|
|
return;
|
|
|
|
BlockToolGlue.ToolBlock.SetPrimitiveType2D( Instance.Current.Is2D );
|
|
BlockToolGlue.ToolBlock.OnObjectTypeChanged();
|
|
}
|
|
|
|
public static bool OrientPrimitives
|
|
{
|
|
get => BlockToolGlue.ToolBlock.GetOrientPrimitives();
|
|
set => BlockToolGlue.ToolBlock.SetOrientPrimitives( value );
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Methods called from native to glue the remaining native tool code to here.
|
|
/// This will become redundant as the API matures.
|
|
/// </summary>
|
|
internal static class BlockToolGlue
|
|
{
|
|
internal static CToolBlock ToolBlock;
|
|
|
|
internal static void BuildGeometry( MapMesh mapMesh, CToolBlockState state )
|
|
{
|
|
Assert.IsValid( mapMesh );
|
|
|
|
// make the map node and construct the geometry here with our managed apis, dog food
|
|
PrimitiveBuilder.PolygonMesh mesh = new();
|
|
IBlockTool.Instance.Current.SetFromBox( state.GetAABBBounds() );
|
|
IBlockTool.Instance.Current.Build( mesh );
|
|
|
|
// Got an override material? e.g from the entity tool, apply it to all the faces
|
|
if ( !string.IsNullOrEmpty( ToolBlock.m_OverrideMaterial ) )
|
|
{
|
|
mesh.Faces.ForEach( f => f.Material = ToolBlock.m_OverrideMaterial );
|
|
}
|
|
|
|
mapMesh.ConstructFromPolygons( mesh );
|
|
|
|
// what the fuck is this shit
|
|
var flags = TransformFlags.LockMaterial | TransformFlags.Rotate;
|
|
using ( mapMesh.TransformOperation( TransformOperationMode.Object, flags ) )
|
|
{
|
|
mapMesh.Transform( state.GetDragWorkPlane().GetWorkPlaneToWorldTransform(), flags );
|
|
}
|
|
}
|
|
|
|
internal static void SetInProgress( bool inProgress ) => IBlockTool.Instance.InProgress = inProgress;
|
|
internal static QWidget BuildUI( CToolBlock toolBlock )
|
|
{
|
|
ToolBlock = toolBlock;
|
|
return IBlockTool.Instance.BuildUI()._widget;
|
|
}
|
|
|
|
internal static void SetOverrideEntity( string entityName ) => IBlockTool.Instance.EntityOverride = entityName;
|
|
}
|