using System;
namespace Sandbox;
public static partial class Gizmo
{
public sealed partial class GizmoControls
{
///
/// A front left up position movement widget. If widget was moved then will return true and out will return the new position.
///
public bool Scale( string name, float value, out float outValue )
{
using var scaler = PushFixedScale();
var screenScale = 1.0f;
var localRotation = Transform.Rotation;
outValue = value;
using ( Sandbox.Gizmo.Scope( name ) )
{
float movement = 0.0f;
Sandbox.Gizmo.Draw.IgnoreDepth = true;
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Up;
if ( Arrow( "up", Vector3.Up, out var xdist, head: "box" ) )
{
movement += xdist;
}
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Left;
if ( Arrow( "left", Vector3.Left, out var ydist, head: "box" ) )
{
movement += ydist;
}
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Forward;
if ( Arrow( "forward", Vector3.Forward, out var zdist, head: "box" ) )
{
movement += zdist;
}
if ( movement == 0.0f )
{
return false;
}
outValue += movement * screenScale * 0.01f;
return true;
}
}
///
/// A front left up position movement widget. If widget was moved then will return true and out will return the new position.
///
public bool Scale( string name, Vector3 value, out Vector3 outValue, Rotation? axisRotation = null, float squareSize = 3.0f )
{
using var scaler = PushFixedScale();
var screenScale = 1.0f;
var localRotation = Transform.Rotation;
var axis = axisRotation ?? Rotation.Identity;
outValue = value;
using var x = Sandbox.Gizmo.Scope( name, Vector3.Zero, axis );
if ( Settings.GlobalSpace )
Transform = Transform.WithRotation( Rotation.Identity );
using ( Sandbox.Gizmo.Scope( name ) )
{
Vector3 movement = 0.0f;
Sandbox.Gizmo.Draw.IgnoreDepth = true;
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Up;
if ( Arrow( "up", Vector3.Up, out var xdist, head: "box" ) )
{
movement += xdist * Vector3.Up;
}
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Left;
if ( Arrow( "left", Vector3.Left, out var ydist, head: "box" ) )
{
movement += ydist * Vector3.Left;
}
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Forward;
if ( Arrow( "forward", Vector3.Forward, out var zdist, head: "box" ) )
{
movement += zdist * Vector3.Forward;
}
if ( squareSize > 0 )
{
float squareOffset = squareSize * 3.0f;
using var scope = Sandbox.Gizmo.Scope( "squares" );
Hitbox.DepthBias *= 0.8f;
using ( Sandbox.Gizmo.Scope() )
{
Sandbox.Gizmo.Transform = Sandbox.Gizmo.Transform.ToWorld( new Transform( Vector3.Zero ) );
Sandbox.Gizmo.Draw.Color = Color.White;
if ( DragBox( "center", squareSize, Rotation.Identity, out var moved ) )
{
movement += moved;
}
}
using ( Sandbox.Gizmo.Scope() )
{
Sandbox.Gizmo.Transform = Sandbox.Gizmo.Transform.ToWorld( new Transform( Vector3.Up * squareOffset + Vector3.Left * squareOffset ) );
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Up;
if ( DragSquare( "left-up", squareSize, Rotation.LookAt( Vector3.Backward, Vector3.Up ), out var moved ) )
{
movement += moved;
}
}
using ( Sandbox.Gizmo.Scope() )
{
Sandbox.Gizmo.Transform = Sandbox.Gizmo.Transform.ToWorld( new Transform( Vector3.Forward * squareOffset + Vector3.Left * squareOffset ) );
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Left;
if ( DragSquare( "forward-left", squareSize, Rotation.LookAt( Vector3.Up, Vector3.Forward ), out var moved ) )
{
movement += moved;
}
}
using ( Sandbox.Gizmo.Scope() )
{
Sandbox.Gizmo.Transform = Sandbox.Gizmo.Transform.ToWorld( new Transform( Vector3.Forward * squareOffset + Vector3.Up * squareOffset ) );
Sandbox.Gizmo.Draw.Color = Sandbox.Gizmo.Colors.Forward;
if ( DragSquare( "forward-up", squareSize, Rotation.LookAt( Vector3.Left, Vector3.Down ), out var moved ) )
{
movement += moved;
}
}
}
if ( movement == 0.0f )
{
return false;
}
outValue += movement * screenScale * 0.01f;
return true;
}
}
}
}